{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "de5138c6",
   "metadata": {},
   "source": [
    "## Teaching GPT multiple tasks at once with prompt engineering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c74f0e7d",
   "metadata": {},
   "outputs": [],
   "source": [
    "from transformers import Trainer, TrainingArguments, DataCollatorForLanguageModeling, GPT2LMHeadModel, pipeline, \\\n",
    "                         GPT2Tokenizer\n",
    "import pandas as pd\n",
    "from datasets import Dataset"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "7463affd",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "06be4764",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(96512, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Text</th>\n",
       "      <th>Summary</th>\n",
       "      <th>Score</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Great taffy at a great price.  There was a wid...</td>\n",
       "      <td>Great taffy</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>This taffy is so good.  It is very soft and ch...</td>\n",
       "      <td>Wonderful, tasty taffy</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Right now I'm mostly just sprouting this so my...</td>\n",
       "      <td>Yay Barley</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>This is a very healthy dog food. Good for thei...</td>\n",
       "      <td>Healthy Dog Food</td>\n",
       "      <td>5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>good flavor! these came securely packed... the...</td>\n",
       "      <td>fresh and greasy!</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                Text                 Summary  \\\n",
       "0  Great taffy at a great price.  There was a wid...             Great taffy   \n",
       "1  This taffy is so good.  It is very soft and ch...  Wonderful, tasty taffy   \n",
       "2  Right now I'm mostly just sprouting this so my...              Yay Barley   \n",
       "3  This is a very healthy dog food. Good for thei...        Healthy Dog Food   \n",
       "4  good flavor! these came securely packed... the...       fresh and greasy!   \n",
       "\n",
       "   Score  \n",
       "0      5  \n",
       "1      5  \n",
       "2      5  \n",
       "3      5  \n",
       "4      4  "
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# https://www.kaggle.com/snap/amazon-fine-food-reviews?select=Reviews.csv\n",
    "\n",
    "reviews = pd.read_csv('../data/reviews.csv')\n",
    "\n",
    "print(reviews.shape)\n",
    "\n",
    "reviews.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9c02af40",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Histogram of Review Length'}, ylabel='Frequency'>"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGzCAYAAAAyiiOsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABC6klEQVR4nO3deVxWZf7/8fcNCLgBbnBLkpK7SWo6GbmU6YjKVKYt7kuYOlmauLeYZoXiuDW5jC3aYrk0ZaW5IGla4oaiqYkbaKaok8qtqIhyfn/05fy8BfWI6H1jr+fjcR7Dua7rPudzLmh4e+7rPtgMwzAEAACAa/JwdQEAAACFAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCXAjlSpVUo8ePVxdxh1v/Pjxuueee+Tp6am6deu6upw89ejRQ5UqVXJ1GYXWqlWrZLPZ9OWXX7q6FNxBCE3ALTJ79mzZbDZt2rQpz/5HHnlEtWvXvunzfP/99xo1atRNH+evYvny5Ro6dKgaNWqkWbNm6Z133rnq2B49eshms5mbj4+PqlWrppEjR+r8+fO3sWrXqVSpkv7xj3+4uoyr+vzzzzV58mRXl4G/CC9XFwDg/0tOTpaHx439W+b777/X1KlTCU4W/fDDD/Lw8NCHH34ob2/v64738fHRBx98IElKT0/XN998ozFjxmjfvn2aM2fOLavz/fffV3Z29i07/p3i888/1/bt2/Xyyy+7uhT8BRCaADfi4+Pj6hJuWEZGhooXL+7qMiw7duyYihYtaikwSZKXl5e6dOli7r/wwgt66KGH9MUXX2jixIkKCgq6JXUWKVLklhwXQP7x9hzgRq5c05SVlaXRo0eratWq8vX1VZkyZdS4cWPFxcVJ+vPto6lTp0qS09tIOTIyMjRo0CCFhITIx8dH1atX17/+9S8ZhuF03nPnzql///4qW7asSpYsqccff1y///67bDab0x2sUaNGyWazaefOnerUqZNKlSqlxo0bS5K2bdumHj166J577pGvr6/sdruee+45/fHHH07nyjnG7t271aVLF/n7+6tcuXJ6/fXXZRiGfvvtNz3xxBPy8/OT3W7XhAkTLM3dxYsXNWbMGFWuXFk+Pj6qVKmSXnnlFWVmZppjbDabZs2apYyMDHOuZs+eben4lx+jcePGMgxD+/fvd+pbsmSJmjRpouLFi6tkyZKKjIzUjh07zP5//etfstlsOnDgQK7jjhgxQt7e3jp58qSkvNc0ZWdna/Lkybr33nvl6+uroKAg9enTx3yNJEVHR6tMmTJO3+OXXnpJNptN7777rtl29OhR2Ww2TZ8+/Yau/2o+++wz1a9fX0WLFlXp0qXVoUMH/fbbb05jct6S3rlzp5o1a6ZixYrprrvuUmxsbK7jHThwQI8//riKFy+uwMBADRw4UMuWLZPNZtOqVavM4y1evFgHDhwwv595zdnbb7+tChUqyNfXV82bN9fevXsL5Jrx18OdJuAWS09P1//+979c7VlZWdd97ahRoxQTE6NevXrpgQcekMPh0KZNm7R582b9/e9/V58+fXT48GHFxcXp008/dXqtYRh6/PHHtXLlSkVFRalu3bpatmyZhgwZot9//12TJk0yx/bo0UPz589X165d9eCDD+rHH39UZGTkVet6+umnVbVqVb3zzjvmL+e4uDjt379fPXv2lN1u144dOzRz5kzt2LFD69atcwpzkvTss8+qZs2aGjt2rBYvXqy33npLpUuX1n/+8x89+uijGjdunObMmaPBgwfrb3/7m5o2bXrNuerVq5c+/vhjPfXUUxo0aJDWr1+vmJgY/frrr/r6668lSZ9++qlmzpypDRs2mG+5PfTQQ9f9PlwpNTVVklSqVCmz7dNPP1X37t0VERGhcePG6ezZs5o+fboaN26sLVu2qFKlSnrmmWc0dOhQzZ8/X0OGDHE65vz589WyZUunY16pT58+mj17tnr27Kn+/fsrJSVF7733nrZs2aKff/5ZRYoUUZMmTTRp0iTt2LHDXDO3Zs0aeXh4aM2aNerfv7/ZJum682rF22+/rddff13PPPOMevXqpePHj+vf//63mjZtqi1btiggIMAce/LkSbVq1Urt2rXTM888oy+//FLDhg1TWFiYWrduLenPsP/oo4/qyJEjGjBggOx2uz7//HOtXLnS6byvvvqq0tPTdejQIfPnuUSJEk5jxo4dKw8PDw0ePFjp6emKjY1V586dtX79+pu+bvwFGQBuiVmzZhmSrrnde++9Tq+pWLGi0b17d3O/Tp06RmRk5DXP069fPyOv/5QXLlxoSDLeeustp/annnrKsNlsxt69ew3DMIzExERDkvHyyy87jevRo4chyXjjjTfMtjfeeMOQZHTs2DHX+c6ePZur7YsvvjAkGatXr851jN69e5ttFy9eNCpUqGDYbDZj7NixZvvJkyeNokWLOs1JXpKSkgxJRq9evZzaBw8ebEgyfvjhB7Ote/fuRvHixa95vCvHHj9+3Dh+/Lixd+9e41//+pdhs9mM2rVrG9nZ2YZhGMbp06eNgIAA4/nnn3d6fVpamuHv7+/UHh4ebtSvX99p3IYNGwxJxieffOJ07ooVK5r7a9asMSQZc+bMcXrt0qVLndqPHTtmSDKmTZtmGIZhnDp1yvDw8DCefvppIygoyHxd//79jdKlS5vXcDUVK1a85s9gamqq4enpabz99ttO7b/88ovh5eXl1P7www/nus7MzEzDbrcb7du3N9smTJhgSDIWLlxotp07d86oUaOGIclYuXKl2R4ZGek0TzlWrlxpSDJq1qxpZGZmmu1TpkwxJBm//PLLNa8byAtvzwG32NSpUxUXF5dru++++6772oCAAO3YsUN79uy54fN+//338vT0NO8s5Bg0aJAMw9CSJUskSUuXLpX051qdy7300ktXPXbfvn1ztRUtWtT8+vz58/rf//6nBx98UJK0efPmXON79eplfu3p6akGDRrIMAxFRUWZ7QEBAapevXqut8Gu9P3330v6862pyw0aNEiStHjx4mu+/loyMjJUrlw5lStXTlWqVNHgwYPVqFEjffPNN+bds7i4OJ06dUodO3bU//73P3Pz9PRUw4YNne6QPPvss0pMTNS+ffvMtnnz5snHx0dPPPHEVetYsGCB/P399fe//93pHPXr11eJEiXMc5QrV041atTQ6tWrJUk///yzPD09NWTIEB09etT8WVqzZo0aN26c6w7gjfrqq6+UnZ2tZ555xqkuu92uqlWr5ro7VKJECac1Yt7e3nrggQecvsdLly7VXXfdpccff9xs8/X11fPPP3/D9fXs2dNp/VqTJk0k6bo/U0BeeHsOuMUeeOABNWjQIFd7qVKl8nzb7nJvvvmmnnjiCVWrVk21a9dWq1at1LVrV0uB68CBAwoODlbJkiWd2mvWrGn25/yvh4eHQkNDncZVqVLlqse+cqwknThxQqNHj9bcuXN17Ngxp7709PRc4++++26nfX9/f/n6+qps2bK52q9cF3WlnGu4sma73a6AgIA81xBZ5evrq++++06SdOjQIcXGxpqL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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reviews['Text'].str.len().plot(kind='hist', title='Histogram of Review Length')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "7d355929",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Histogram of Summary Length'}, ylabel='Frequency'>"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGzCAYAAAAyiiOsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABL2ElEQVR4nO3deViU9f7/8ReggKIDuQByxKU0FXdRkTLNRDFpseykZoqmmR5cKbdTqS0nTE+lHbc6dsROmktXekpyIdwqyQUll9KsMC0dtBRGUUHg/v3Rj/vrCNotooP4fFzXXDGf+z33vO+P6Ly6t3EzDMMQAAAArsjd1Q0AAADcDAhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITcB1VqdOHQ0YMMDVbZR506dP1+233y4PDw+1aNHC1e3gJhEfHy83Nzft2LHD1a3gJkBoAq7Cn/0De++996pJkybX/D6fffaZpkyZcs3ruVWsW7dO48aN0913360FCxbotddeu2L9p59+qo4dO8rf318VK1bU7bffrscff1xr1qy5QR2XPW5ubho+fLir27isOXPmKD4+3tVt4CZXztUNAGXdgQMH5O5+df9/8tlnn2n27NkEJ4vWr18vd3d3vffee/L09Lxi7T//+U+NHTtWHTt21MSJE1WxYkX98MMP+vzzz7VkyRJ169btBnWNG2nOnDmqVq0ae31xTQhNwHXm5eXl6hauWlZWlnx8fFzdhmXHjx9XhQoV/jQw5ebm6pVXXlGXLl20bt26Itdzq8nNzVV+fv6fzh0ADs8B192l5zRduHBBL730kurXry9vb29VrVpV7du3V2JioiRpwIABmj17tqQ/DnkUPApkZWXp2WefVXBwsLy8vNSgQQP985//lGEYTu977tw5jRw5UtWqVVPlypX10EMP6ddff5Wbm5vTHqwpU6bIzc1N3377rZ544gnddtttat++vSRp9+7dGjBggG6//XZ5e3srMDBQTz31lH7//Xen9ypYx/fff68nn3xSvr6+ql69ul588UUZhqEjR47o4Ycfls1mU2BgoN544w1Lc1cQcu644w55eXmpTp06+vvf/67s7Gyzxs3NTQsWLFBWVpY5V5c7DPPbb7/J4XDo7rvvLnK5v7+/+XPBodhDhw451WzcuFFubm7auHGjOVZwWHb37t3q2LGjKlasqHr16umjjz6SJG3atElhYWGqUKGCGjRooM8//7xE5y8nJ0eTJk1SaGiofH195ePjo3vuuUcbNmxwqjt06JDc3Nz0z3/+UzNmzDDnddu2bfLx8dGoUaMKzckvv/wiDw8PxcXFFTlnVyM/P18zZsxQ48aN5e3trYCAAD3zzDM6deqUU12dOnX0wAMP6Msvv1Tbtm3l7e2t22+/Xe+//36hdRbMeYUKFVSzZk29+uqrWrBggdOfXZ06dbRv3z5t2rTJ/B259957ndaTnZ2t2NhYVa9eXT4+PnrkkUd04sSJa95mlC3saQKKITMzU7/99luh8QsXLvzpa6dMmaK4uDgNHjxYbdu2lcPh0I4dO7Rz50516dJFzzzzjI4eParExET997//dXqtYRh66KGHtGHDBg0aNEgtWrTQ2rVrNXbsWP3666966623zNoBAwZo2bJl6tevn9q1a6dNmzYpKirqsn399a9/Vf369fXaa6+ZASwxMVE//fSTBg4cqMDAQO3bt0/vvvuu9u3bp6+//topzElSr1691KhRI02dOlUJCQl69dVXVaVKFb3zzju677779Prrr2vRokV67rnn1KZNG3Xo0OGKczV48GAtXLhQjz32mJ599llt3bpVcXFx+u6777RixQpJ0n//+1+9++672rZtm+bPny9Juuuuu4pcn7+/vypUqKBPP/1UI0aMUJUqVa74/lfj1KlTeuCBB9S7d2/99a9/1dy5c9W7d28tWrRIo0eP1tChQ/XEE09o+vTpeuyxx3TkyBFVrlzZaR3FnT+Hw6H58+erT58+evrpp3X69Gm99957ioyM1LZt2wqdGL9gwQKdP39eQ4YMkZeXl2rVqqVHHnlES5cu1ZtvvikPDw+z9sMPP5RhGOrbt+81z9Ezzzyj+Ph4DRw4UCNHjlRaWppmzZqlXbt26auvvlL58uXN2h9++EGPPfaYBg0apOjoaP3nP//RgAEDFBoaqsaNG0uSfv31V3Xq1Elubm6aOHGifHx8NH/+/EJ7d2fMmKERI0aoUqVKev755yVJAQEBTjUjRozQbbfdpsmTJ+vQoUOaMWOGhg8frqVLl17zdqMMMQBYtmDBAkPSFR+NGzd2ek3t2rWN6Oho83nz5s2NqKioK75PTEyMUdRfz5UrVxqSjFdffdVp/LHHHjPc3NyMH374wTAMw0hJSTEkGaNHj3aqGzBggCHJmDx5sjk2efJkQ5LRp0+fQu939uzZQmMffvihIcnYvHlzoXUMGTLEHMvNzTVq1qxpuLm5GVOnTjXHT506ZVSoUMFpToqSmppqSDIGDx7sNP7cc88Zkoz169ebY9HR0YaPj88V11dg0qRJhiTDx8fHuP/++41//OMfRkpKSqG6gj/rtLQ0p/ENGzYYkowNGzaYYx07djQkGYsXLzbH9u/fb0gy3N3dja+//tocX7t2rSHJWLBggTl2rfOXm5trZGdnO/V56tQpIyAgwHjqqafMsbS0NEOSYbPZjOPHjzvVF/S1evVqp/FmzZoZHTt2LDQ/l5JkxMTEXHb5F198YUgyFi1a5DS+Zs2aQuO1a9cu9Dt2/Phxw8vLy3j22WfNsREjRhhubm7Grl27zLHff//dqFKlSqE/u8aNGxe5HQV/zhEREUZ+fr45PmbMGMPDw8PIyMj4023HrYPDc0AxzJ49W4mJiYUezZo1+9PX+vn5ad++fTp48OBVv+9nn30mDw8PjRw50mn82WeflWEYWr16tSSZV4H97W9/c6obMWLEZdc9dOjQQmMVKlQwfz5//rx+++03tWvXTpK0c+fOQvWDBw82f/bw8FDr1q1lGIYGDRpkjvv5+alBgwb66aefLtuL9Me2SlJsbKzT+LPPPitJSkhIuOLrL+ell17S4sWL1bJlS61du1bPP/+8QkND1apVK3333XfFWqckVapUSb179zafN2jQQH5+fmrUqJHCwsLM8YKfi9r+4s6fh4eHeU5Sfn6+Tp48qdzcXLVu3brIP6eePXuqevXqTmMREREKCgrSokWLzLG9e/dq9+7devLJJy3Pw+UsX75cvr6+6tKli3777TfzERoaqkqVKhU6lBgSEqJ77rnHfF69evVC271mzRqFh4c77UmrUqVKsfaKDRkyxGnP6T333KO8vDz9/PPPV70ulF0cngOKoW3btmrdunWh8dtuu63Iw3YXe/nll/Xwww/rzjvvVJMmTdStWzf169fPUuD6+eefFRQUVOiwTqNGjczlBf91d3dX3bp1nerq1at32XVfWitJJ0+e1EsvvaQlS5YUOkk6MzOzUH2tWrWcnvv6+srb21vVqlUrNH7peVGXKtiGS3sODAyUn5/fNX2Y9enTR3369JHD4dDWrVsVHx+vxYsX68EHH9TevXvl7e191eusWbNmocOVvr6+Cg4OLjQmqdB5PNK1zd/ChQv1xhtvaP/+/U6HiYv6cy1qzN3dXX379tXcuXN19uxZVaxYUYsWLZK3t7f++te/FrXJV+XgwYPKzMx0Om/sYpf+fl06F9Iff78unreff/5Z4eHhhequ9Ht+OZe+32233Sap6D8n3LoITcAN1qFDB/3444/63//+p3Xr1mn+/Pl66623NG/ePKc9DTfaxXuVCjz++OPasmWLxo4dqxYtWqhSpUrKz89Xt27dlJ+fX6j+4nNhrjQmqdCJ65dzaRApSTabTV26dFGXLl1Uvnx5LVy4UFu3blXHjh0v+755eXlFjl9uO69m+4s7fx988IEGDBigHj16aOzYsfL39zdP3v7xxx8LvbaoP2tJ6t+/v6ZPn66VK1eqT58+Wrx4sR544AEz6F2L/Px8+fv7O+3Jutile76u9ffmat3o98PNidAEuECVKlU0cOBADRw4UGfOnFGHDh00ZcoUMzRd7gO7du3a+vzzz3X69GmnvU379+83lxf8Nz8/X2lpaapfv75Z98MPP1ju8dSpU0pKStJLL72kSZMmmePFOaxYHAXbcPDgQXNPmiSlp6crIyPD3NaS0rp1ay1cuFDHjh2T9H97GjIyMpzqSuPhmo8++ki33367Pv74Y6ffncmTJ1/Vepo0aaKWLVtq0aJFqlmzpg4fPqx//etfJdLjHXfcoc8//1x33333ZUPb1apdu3aRv9NFjV3P8I1bB+c0ATfYpYdVKlWqpHr16jldRl9wj6RLP7C7d++uvLw8zZo1y2n8rbfekpubm+6//35JUmRkpKQ/buh3sav5ACz4P+9L/097xowZltdxLbp3717k+7355puSdMUrAS/n7NmzSk5OLnJZwflgDRo0kPTHh7wkbd682azJy8vTu+++e9Xve70V9We1devWy27rlfTr10/r1q3TjBkzVLVqVfN36lo9/vjjysvL0yuvvFJoWW5ubqHfdSsiIyOVnJys1NRUc+zkyZNF7s3y8fEp1nsAF2NPE3CDhYSE6N5771VoaKiqVKmiHTt26KOPPnL6CorQ0FBJ0siRIxUZGSkPDw/17t1bDz74oDp16qTnn39ehw4dUvPmzbVu3Tr973//0+jRo80P+tDQUPXs2VMzZszQ77//bt5y4Pvvv5dk7f+6bTabOnTooGnTpunChQv6y1/+onXr1iktLe06zEphzZs3V3R0tN59911lZGSoY8eO2rZtmxYuXKgePXqoU6dOV73Os2fP6q677lK7du3UrVs3BQcHKyMjQytXrtQXX3yhHj16qGXLlpKkxo0bq127dpo4caJOnjypKlWqaMmSJcrNzS3pTb1mDzzwgD7++GM98sgjioqKUlpamubNm6eQkBCdOXPmqtb1xBNPaNy4cVqxYoWGDRvmdBuAP7Njxw69+uqrhcbvvfdedezYUc8884zi4uKUmpqqrl27qnz58jp48KCWL1+umTNn6rHHHruqXseNG6cPPvhAXbp00YgRI8xbDtSqVUsnT550+j0PDQ3V3Llz9eqrr6pevXry9/fXfffdd1XvBxCagBts5MiR+uSTT7Ru3TplZ2erdu3aevXVVzV27Fiz5tFHH9WIESO0ZMkSffDBBzIMQ71795a7u7s++eQTTZo0SUuXLtWCBQtUp04dTZ8+3byqrMD777+vwMBAffjhh1qxYoUiIiK0dOlSNWjQwPKJzosXL9aIESM0e/ZsGYahrl27avXq1QoKCirRObmc+fPn6/bbb1d8fLxWrFihwMBATZw48aoPOxXw8/PTv//9byUkJGjBggWy2+3y8PBQgwYNNH369EJXJS5atEjPPPOMpk6dKj8/Pw0aNEidOnVSly5dSmLzSsyAAQNkt9v1zjvvaO3atQoJCdEHH3yg5cuXO92E04qAgAB17dpVn332mfr163dVr926dau2bt1aaPyVV15R+/btNW/ePIWGhuqdd97R3//+d5UrV0516tTRk08+edkbjl5JcHCwNmzYoJEjR+q1115T9erVFRMTIx8fH40cOdLp93zSpEn6+eefNW3aNJ0+fVodO3YkNOGquRmc5QbcMlJTU9WyZUt98MEHJXKzQpRNjzzyiPbs2XNV58CVJqNHj9Y777yjM2fOXPYEb6A4OKcJKKPOnTtXaGzGjBlyd3f/0ztx49Z17NgxJSQkXPVeJle59Pf8999/13//+1+1b9+ewIQSx+E5oIyaNm2aUlJS1KlTJ5UrV06rV6/W6tWrNWTIkEL3DgLS0tL01Vdfaf78+SpfvryeeeYZV7dkSXh4uO699141atRI6enpeu+99+RwOPTiiy+6ujWUQYQmoIy66667lJiYqFdeeUVnzpxRrVq1NGXKFPO7t4CLbdq0SQMH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QJlUrNB0zz336P333zefu7m5KT8/X9OmTVOnTp1KrDkAAIDSoliH56ZNm6bOnTtrx44dysnJ0bhx47Rv3z6dPHlSX331VUn3CAAA4HLF2tPUpEkTff/992rfvr0efvhhZWVl6dFHH9WuXbt0xx13lHSPAAAALnfVe5ouXLigbt26ad68eXr++eevR08AAAClzlXvaSpfvrx27959PXoBAAAotYp1eO7JJ5/Ue++9V9K9AAAAlFrFOhE8NzdX//nPf/T5558rNDS00HfOvfnmmyXSHAAAQGlxVaHpp59+Up06dbR37161atVKkvT999871bi5uZVcdwAAAKXEVYWm+vXr69ixY9qwYYOkP7425e2331ZAQMB1aQ4AAKC0uKpzmgzDcHq+evVqZWVllWhDAAAApVGxTgQvcGmIAgAAKKuuKjS5ubkVOmeJc5gAAMCt4KrOaTIMQwMGDDC/lPf8+fMaOnRooavnPv7445LrEAAAoBS4qtAUHR3t9PzJJ58s0WYAAABKq6sKTQsWLLhefQAAAJRq13QiOAAAwK2C0AQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAApeGps2bN+vBBx9UUFCQ3NzctHLlSqflAwYMkJubm9OjW7duTjUnT55U3759ZbPZ5Ofnp0GDBunMmTNONbt379Y999wjb29vBQcHa9q0aYV6Wb58uRo2bChvb281bdpUn332WYlvLwAAuHm5NDRlZWWpefPmmj179mVrunXrpmPHjpmPDz/80Gl53759tW/fPiUmJmrVqlXavHmzhgwZYi53OBzq2rWrateurZSUFE2fPl1TpkzRu+++a9Zs2bJFffr00aBBg7Rr1y716NFDPXr00N69e0t+owEAwE3JzTAMw9VNSJKbm5tWrFihHj16mGMDBgxQRkZGoT1QBb777juFhIRo+/btat26tSRpzZo16t69u3755RcFBQVp7ty5ev7552W32+Xp6SlJmjBhglauXKn9+/dLknr16qWsrCytWrXKXHe7du3UokULzZs3z1L/DodDvr6+yszMlM1mK8YMXFmdCQklvk4UdmhqlKtbAADcQFfz+V3qz2nauHGj/P391aBBAw0bNky///67uSw5OVl+fn5mYJKkiIgIubu7a+vWrWZNhw4dzMAkSZGRkTpw4IBOnTpl1kRERDi9b2RkpJKTky/bV3Z2thwOh9MDAACUXaU6NHXr1k3vv/++kpKS9Prrr2vTpk26//77lZeXJ0my2+3y9/d3ek25cuVUpUoV2e12syYgIMCppuD5n9UULC9KXFycfH19zUdwcPC1bSwAACjVyrm6gSvp3bu3+XPTpk3VrFkz3XHHHdq4caM6d+7sws6kiRMnKjY21nzucDgITgAAlGGlek/TpW6//XZVq1ZNP/zwgyQpMDBQx48fd6rJzc3VyZMnFRgYaNakp6c71RQ8/7OaguVF8fLyks1mc3oAAICy66YKTb/88ot+//131ahRQ5IUHh6ujIwMpaSkmDXr169Xfn6+wsLCzJrNmzfrwoULZk1iYqIaNGig2267zaxJSkpyeq/ExESFh4df700CAAA3CZeGpjNnzig1NVWpqamSpLS0NKWmpurw4cM6c+aMxo4dq6+//lqHDh1SUlKSHn74YdWrV0+RkZGSpEaNGqlbt256+umntW3bNn311VcaPny4evfuraCgIEnSE088IU9PTw0aNEj79u3T0qVLNXPmTKdDa6NGjdKaNWv0xhtvaP/+/ZoyZYp27Nih4cOH3/A5AQAApZNLQ9OOHTvUsmVLtWzZUpIUGxurli1batKkSfLw8NDu3bv10EMP6c4779SgQYMUGhqqL774Ql5eXuY6Fi1apIYNG6pz587q3r272rdv73QPJl9fX61bt05paWkKDQ3Vs88+q0mTJjndy+muu+7S4sWL9e6776p58+b66KOPtHLlSjVp0uTGTQYAACjVSs19mm523KepbOA+TQBwaylT92kCAAAoDQhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0AQAAGABoQkAAMACQhMAAIAFhCYAAAALyrm6AaA0qTMhwdUtXLVDU6Nc3QIA3BLY0wQAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWODS0LR582Y9+OCDCgoKkpubm1auXOm03DAMTZo0STVq1FCFChUUERGhgwcPOtWcPHlSffv2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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reviews['Summary'].str.len().plot(kind='hist', title='Histogram of Summary Length')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "e068184e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: title={'center': 'Histogram of Summary Length'}, ylabel='Frequency'>"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGzCAYAAAAyiiOsAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA8+0lEQVR4nO3dfVxUdd7/8feAcuMN4B0glyiaZuJtYiLlbaKY1KbZbt5UapTZ4i2m6daqrV5hupq2mdZlgW2aZldaad4QKm6JmiiZbpoaiq6gpgJKiQjn90cX5+eI2gHRGfD1fDzmEfM9nznzOV+meHfmO2dshmEYAgAAwA25OLoBAACA8oDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAsITQAAABYQmgAAACwgNAEAAFhAaAIAALCA0ATcYkFBQRoyZIij26jwZs2apUaNGsnV1VVt2rRxdDsoJ+Lj42Wz2bRz505Ht4JygNAElMDv/Qe2a9euatGixU0/z5dffqmpU6fe9H7uFBs2bNCECRP0wAMPKC4uTq+99toN67/44gt16dJFvr6+qlKliho1aqQ//elPWrdu3W3quOKx2WwaMWKEo9u4rrffflvx8fGObgPlXCVHNwBUdAcOHJCLS8n+/+TLL7/U/PnzCU4Wbdy4US4uLnrvvffk5uZ2w9q///3vGj9+vLp06aJJkyapSpUqOnTokL766istW7ZMvXr1uk1d43Z6++23Vbt2bc764qYQmoBbzN3d3dEtlFhubq6qVq3q6DYsO3XqlDw9PX83MF2+fFnTpk1Tjx49tGHDhmvu505z+fJlFRYW/u7cAeDtOeCWu3pNU35+vl599VU1adJEHh4eqlWrljp27KiEhARJ0pAhQzR//nxJv73lUXQrkpubq3HjxikwMFDu7u5q2rSp/v73v8swDLvn/fXXXzVq1CjVrl1b1atX1x/+8Af95z//kc1mszuDNXXqVNlsNv373//WwIEDVaNGDXXs2FGStGfPHg0ZMkSNGjWSh4eH/P399cwzz+jMmTN2z1W0jx9//FFPPvmkvL29VadOHf31r3+VYRg6duyYHn30UXl5ecnf31+zZ8+2NHdFIeeuu+6Su7u7goKC9Je//EV5eXlmjc1mU1xcnHJzc825ut7bMD///LNycnL0wAMPXHO7r6+v+XPRW7FHjhyxq9m8ebNsNps2b95sjhW9Lbtnzx516dJFVapUUePGjfXJJ59IkpKSkhQaGipPT081bdpUX331VZnO36VLlzR58mSFhITI29tbVatWVadOnbRp0ya7uiNHjshms+nvf/+75s6da87rjh07VLVqVY0ePbrYnBw/flyurq6KjY295pyVRGFhoebOnavmzZvLw8NDfn5+ev7553Xu3Dm7uqCgID388MP6+uuv1b59e3l4eKhRo0b64IMPiu2zaM49PT1Vr149TZ8+XXFxcXa/u6CgIO3bt09JSUnma6Rr1652+8nLy1NMTIzq1KmjqlWrqm/fvjp9+vRNHzMqFs40AaWQnZ2tn3/+udh4fn7+7z526tSpio2N1bPPPqv27dsrJydHO3fu1K5du9SjRw89//zzOnHihBISEvTPf/7T7rGGYegPf/iDNm3apKioKLVp00br16/X+PHj9Z///EdvvPGGWTtkyBB9/PHHeuqpp9ShQwclJSUpMjLyun398Y9/VJMmTfTaa6+ZASwhIUE//fSThg4dKn9/f+3bt0/vvvuu9u3bp23bttmFOUl64okn1KxZM82YMUNr1qzR9OnTVbNmTb3zzjt68MEH9frrr2vJkiV68cUXdd9996lz5843nKtnn31Wixcv1uOPP65x48Zp+/btio2N1Q8//KCVK1dKkv75z3/q3Xff1Y4dO7Ro0SJJ0v3333/N/fn6+srT01NffPGFRo4cqZo1a97w+Uvi3Llzevjhh9W/f3/98Y9/1IIFC9S/f38tWbJEY8aM0fDhwzVw4EDNmjVLjz/+uI4dO6bq1avb7aO085eTk6NFixZpwIABeu6553T+/Hm99957ioiI0I4dO4otjI+Li9PFixc1bNgwubu7q379+urbt6+WL1+uOXPmyNXV1az96KOPZBiGBg0adNNz9Pzzzys+Pl5Dhw7VqFGjlJaWprfeeku7d+/WN998o8qVK5u1hw4d0uOPP66oqCgNHjxY77//voYMGaKQkBA1b95ckvSf//xH3bp1k81m06RJk1S1alUtWrSo2NnduXPnauTIkapWrZpefvllSZKfn59dzciRI1WjRg1NmTJFR44c0dy5czVixAgtX778po8bFYgBwLK4uDhD0g1vzZs3t3tMgwYNjMGDB5v3W7dubURGRt7weaKjo41r/eu5atUqQ5Ixffp0u/HHH3/csNlsxqFDhwzDMIyU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acOGDUpLS7sFs1Jc69atNXjwYL377rvKyspSly5dtGPHDi1evFh9+vRRt27dSrzPX375Rffff786dOigXr16KTAwUFlZWVq1apX+9a9/qU+fPrr33nslSc2bN1eHDh00adIknT17VjVr1tSyZct0+fLlsj7Um/bwww/r008/Vd++fRUZGam0tDQtXLhQwcHBunDhQon2NXDgQE2YMEErV67UCy+8YHcZgN+zc+dOTZ8+vdh4165d1aVLFz3//POKjY1VamqqevbsqcqVK+vgwYNasWKF5s2bp8cff7xEvU6YMEEffvihevTooZEjR5qXHKhfv77Onj1r9zoPCQnRggULNH36dDVu3Fi+vr568MEHS/R8AKEJuM1GjRqlzz//XBs2bFBeXp4aNGig6dOna/z48WbNY489ppEjR2rZsmX68MMPZRiG+vfvLxcXF33++eeaPHmyli9frri4OAUFBWnWrFnmp8qKfPDBB/L399dHH32klStXKjw8XMuXL1fTpk0tL3ReunSpRo4cqfnz58swDPXs2VNr165VQEBAmc7J9SxatEiNGjVSfHy8Vq5cKX9/f02aNKnEbzsV8fHx0f/8z/9ozZo1iouLU2ZmplxdXdW0aVPNmjWr2KcSlyxZoueff14zZsyQj4+PoqKi1K1bN/Xo0aMsDq/MDBkyRJmZmXrnnXe0fv16BQcH68MPP9SKFSvsLsJphZ+fn3r27Kkvv/xSTz31VIkeu337dm3fvr3Y+LRp09SxY0ctXLhQISEheuedd/SXv/xFlSpVUlBQkJ588snrXnD0RgIDA7Vp0yaNGjVKr732murUqaPo6GhVrVpVo0aNsnudT548WUePHtXMmTN1/vx5denShdCEErMZrHID7hipqam699579eGHH5bJxQpRMfXt21fff/99idbAOZMxY8bonXfe0YULF667wBsoDdY0ARXUr7/+Wmxs7ty5cnFx+d0rcePOlZGRoTVr1pT4LJOjXP06P3PmjP75z3+qY8eOBCaUOd6eAyqomTNnKiUlRd26dVOlSpW0du1arV27VsOGDSt27SAgLS1N33zzjRYtWqTKlSvr+eefd3RLloSFhalr165q1qyZTp48qffee085OTn661//6ujWUAERmoAK6v7771dCQoKmTZumCxcuqH79+po6dar53VvAlZKSkjR06FDVr19fixcvlr+/v6NbsqR379765JNP9O6778pms6lt27Z67733OJuKW4I1TQAAABawpgkAAMACQhMAAIAFrGkqI4WFhTpx4oSqV6/O5foBACgnDMPQ+fPnFRAQIBeXG59LIjSVkRMnTvCJJAAAyqljx46pXr16N6whNJWRoi9PPXbsmLy8vBzcDQAAsCInJ0eBgYF2X4J+PYSmMlL0lpyXlxehCQCAcsbK0hoWggMAAFhAaAIAALCA0AQAAGCBQ0NTbGys7rvvPlWvXl2+vr7q06ePDhw4YFfTtWtX2Ww2u9vw4cPtatLT0xUZGakqVarI19dX48eP1+XLl+1qNm/erLZt28rd3V2NGzdWfHx8sX7mz5+voKAgeXh4KDQ0VDt27CjzYwYAAOWTQ0NTUlKSoqOjtW3bNiUkJCg/P189e/ZUbm6uXd1zzz2njIwM8zZz5kxzW0FBgSIjI3Xp0iVt3bpVixcvVnx8vCZPnmzWpKWlKTIyUt26dVNqaqrGjBmjZ599VuvXrzdrli9frpiYGE2ZMkW7du1S69atFRERoVOnTt36iQAAAE7Pqb577vTp0/L19VVSUpL5ZYtdu3ZVmzZtNHfu3Gs+Zu3atXr44Yd14sQJ+fn5SZIWLlyol156SadPn5abm5teeuklrVmzRnv37jUf179/f2VlZWndunWSpNDQUN1333166623JP12scrAwECNHDlSEydO/N3ec3Jy5O3trezsbD49BwBAOVGSv99OtaYpOztbklSzZk278SVLlqh27dpq0aKFJk2apF9++cXclpycrJYtW5qBSZIiIiKUk5Ojffv2mTXh4eF2+4yIiFBycrIk6dKlS0pJSbGrcXFxUXh4uFlztby8POXk5NjdAABAxeU012kqLCzUmDFj9MADD6hFixbm+MCBA9WgQQMFBARoz549eumll3TgwAF9+umnkqTMzEy7wCTJvJ+ZmXnDmpycHP366686d+6cCgoKrlmzf//+a/YbGxurV1999eYOGgAAlBtOE5qio6O1d+9eff3113bjw4YNM39u2bKl6tatq+7du+vw4cO66667bnebpkmTJikmJsa8X3RFUQAAUDE5RWgaMWKEVq9erS1btvzu976EhoZKkg4dOqS77rpL/v7+xT7ldvLkSUmSv7+/+c+isStrvLy85OnpKVdXV7m6ul6zpmgfV3N3d5e7u7v1gwQA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rPsAAABwamW6pgkAAKCiKtWZppiYGMu1c+bMKc1TAAAAOJVShabdu3dr9+7dys/PV9OmTSVJP/74o1xdXdW2bVuzzmazlU2XAAAADlaq0PTII4+oevXqWrx4sWrUqCHptwteDh06VJ06ddK4cePKtEkAAABHK9WaptmzZys2NtYMTJJUo0YNTZ8+nU/PAQCACqlUoSknJ0enT58uNn769GmdP3/+ppsCAABwNqUKTX379tXQoUP16aef6vjx4zp+/Lj+93//V1FRUXrsscfKukcAAACHK9WapoULF+rFF1/UwIEDlZ+f/9uOKlVSVFSUZs2aVaYNAgAAOINShaYqVaro7bff1qxZs3T48GFJ0l133aWqVauWaXMAAADO4qYubpmRkaGMjAw1adJEVatWlWEYZdUXAACAUylVaDpz5oy6d++uu+++W71791ZGRoYkKSoqissNAACACqlUoWns2LGqXLmy0tPTVaVKFXP8iSee0Lp168qsOQAAAGdRqjVNGzZs0Pr161WvXj278SZNmujo0aNl0hgAAIAzKdWZptzcXLszTEXOnj0rd3f3m24KAADA2ZQqNHXq1EkffPCBed9ms6mwsFAzZ85Ut27dyqw5AAAAZ1Gqt+dmzpyp7t27a+fOnbp06ZImTJigffv26ezZs/rmm2/KukcAAACHK9WZphYtWujHH39Ux44d9eijjyo3N1ePPfaYdu/erbvuuqusewQAAHC4Ep9pys/PV69evbRw4UK9/PLLt6InAAAAp1PiM02VK1fWnj17bkUvAAAATqtUb889+eSTeu+998q6FwAAAKdVqoXgly9f1vvvv6+vvvpKISEhxb5zbs6cOWXSHAAAgLMoUWj66aefFBQUpL1796pt27aSpB9//NGuxmazlV13AAAATqJEoalJkybKyMjQpk2bJP32tSlvvvmm/Pz8bklzAAAAzqJEa5oMw7C7v3btWuXm5pZpQwAAAM6oVAvBi1wdogAAACqqEoUmm81WbM0Sa5gAAMCdoERrmgzD0JAhQ8wv5b148aKGDx9e7NNzn376adl1CAAA4ARKFJoGDx5sd//JJ58s02YAAACcVYnenouLi7N0s2rLli165JFHFBAQIJvNplWrVtltNwxDkydPVt26deXp6anw8HAdPHjQrubs2bMaNGiQvLy85OPjo6ioKF24cMGuZs+ePerU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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# remove very short and very long summaries\n",
    "reviews = reviews[(reviews['Summary'].str.len() < 50)]\n",
    "\n",
    "reviews['Summary'].str.len().plot(kind='hist', title='Histogram of Summary Length')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "7a998511",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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E05r2Jz+vq62tlaHDh1qtWt4OXV1daqurr7svnBavytprL+va+3rd9999+nQoUMqLy+3H8OHD9eUKVNUXl5+2QAQTmvYnP6+rrWv4dedP39eH3300RXne8PWL6QfazbU559/bh08eNA6ePCgJclatmyZdfDgQevjjz+2LMuynnnmGWvq1Kl2/V//+lcrLi7Omj17tvX+++9b+fn5VlRUlFVUVHSjWmhUsP0tX77c2rx5s/XBBx9Yhw4dsp5++mkrMjLSeuutt25UC42aOXOm1bFjR2vnzp3WqVOn7MeFCxfsmqlTp1rPPPOM/fydd96x2rRpYz3//PPW+++/b82bN8+Kjo62Dh06dCNaaFRz+luwYIG1fft266OPPrLKysqsyZMnW7GxsdaRI0duRAtX9cwzz1i7du2yjh8/bv3lL3+xnnnmGSsiIsIqLi62LCu818+ygu8v3Nbvcr5+91G4r+HXXa2/cFvDn/70p9bOnTut48ePW++8846Vmppq3XLLLdbp06cty2o960fIaYb6W6a//sjIyLAsy7IyMjKse++9t8ExycnJVkxMjPXNb37TWrdu3XWfd1MF299zzz1nfetb37JiY2OtLl26WKNHj7Z27NhxYybfBJfrTVLAmtx77712v/U2btxo3X777VZMTIx1xx13WFu3br2+E2+i5vSXnZ1t9e7d24qJibHi4+OtBx54wDpw4MD1n3wTPfbYY1afPn2smJgY69Zbb7Xuu+8+OwBYVnivn2UF31+4rd/lfD0EhPsaft3V+gu3NZw0aZLVvXt3KyYmxvrGN75hTZo0yfrwww/t/a1l/SIsy7JCe60IAADg+uMzOQAAwEiEHAAAYCRCDgAAMBIhBwAAGImQAwAAjETIAQAARiLkAAAAIxFyAACAkQg5AADASIQcAABgJEIOAAAwEiEHAAAY6f8HkyCOh6KWGgMAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reviews['Score'].hist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "683c807d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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Y91www3at2+fz7pPP/1UV155paRvb1aOjY1VSUmJ0e50OrV582ZZrVZJktVqVWVlpcrKyoya9957T7W1tUpOTjZqNm7c6HNNzm63q0uXLsaTX1ar1Wc/3hrvfgAAACQ/w8748eP14Ycf6ne/+53+/e9/a/ny5Xr55ZeVlZUlSQoKClJOTo6efvppvfXWW9qxY4ceeughxcXFaciQIZK+PRM0cOBAjRw5Ulu2bNEHH3yg7OxsDR8+XHFxcZKkBx54QGFhYcrMzNSuXbu0YsUKzZ8/3+cS1Lhx41RUVKTZs2dr7969mjp1qrZt26bs7OwGOjQAAMAM/LqM1adPH7355pvKy8vT9OnTlZCQoHnz5ik9Pd2omThxok6dOqVRo0apsrJSN954o4qKihQREWHULFu2TNnZ2brjjjsUHBysoUOH6oUXXjDao6OjVVxcrKysLCUlJalNmzbKz8/3+S6e/v37a/ny5Zo8ebKefPJJXX311Vq9erWuvfbaizkeAADAZII8Hs+l9Xx0A3I6nYqOjlZVVVWD36BcWFioiVtCLql7dg4+mxboIQANxjsPBw8ezD07QAA05hz09/Obv40FAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMjbADAABMza+wM3XqVAUFBfn8dO3a1Wg/c+aMsrKy1Lp1azVr1kxDhw5VRUWFTx+HDh1SWlqaoqKi1K5dO02YMEFnz571qVm/fr169eql8PBwde7cWUuWLKkzloULF6pTp06KiIhQcnKytmzZ4s9LAQAAlwm/z+xcc801OnLkiPHz/vvvG23jx4/X22+/rVWrVmnDhg06fPiw7rnnHqO9pqZGaWlpqq6u1qZNm7R06VItWbJE+fn5Rs2BAweUlpam2267TeXl5crJydGjjz6qdevWGTUrVqxQbm6upkyZou3bt6tHjx6y2Ww6evTohR4HAABgUn6HnSZNmig2Ntb4adOmjSSpqqpK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jTXmgyRVVlbq0UcfVdu2bWWxWHT77bfr448/9unj6aefVrt27dS8eXM9+uijeuKJJ3wuP23dulUDBgxQmzZtFB0drVtuuUXbt2832jt16iRJuvvuuxUUFGQsf/cyVnFxsSIiIupcih43bpxuv/12Y/n999/XTTfdpMjISMXHx+uxxx7TqVOX1l+kBqSLn5sPP/ywhgwZ4tNnTk6Obr31VqN9w4YNmj9/vvFZePDgQePz8p133lFSUpLCw8P1/vvv67PPPtNdd92lmJgYNWvWTH369NG777570a/zsgs7krR06VI1adJEW7Zs0fz58zVnzhy98sorkr79H7Nt2za99dZbKi0tlcfj0eDBg+V2uyVJWVlZcrlc2rhxo3bs2KHnnnvunP8q7N+/v+bNmyeLxaIjR47oyJEjevzxx+vUpaen6+2339bJkyeNdevWrdPp06d19913S/r2r7W//vrrKigo0K5duzR+/Hj9+te/1oYNGxrj8ACNYunSpWratKk2b96sWbNmafr06bLb7ZKk++67T0ePHtU777yjsrIy9erVS3fccYeOHz8uSVq2bJmeeeYZPffccyorK1PHjh310ksv+fT/9ddfKyMjQ++//74+/PBDXX311Ro8eLC+/vprSd+GIUlavHixjhw5Yix/1x133KEWLVrob3/7m7GupqZGK1asUHp6uiTps88+08CBAzV06FB98sknWrFihd5//31lZ2c3/EEDfgIXMzd/zPz582W1WjVy5EjjszA+Pt5of+KJJ/Tss89qz549uu6663Ty5EkNHjxYJSUl+uijjzRw4EDdeeedOnTo0MW9SM9l5pZbbvF069bNU1tba6ybNGmSp1u3bp5PP/3UI8nzwQcfGG1ffvmlJzIy0rNy5UqPx+PxdO/e3TN16tRz9v3Pf/7TI8lz4sQJj8fj8SxevNgTHR1dp+7KK6/0zJ071+PxeDxut9vTpk0bz+uvv26033///Z5hw4Z5PB6P58yZM56oqCjPpk2bfPrIzMz03H///X6/fiAQbrnlFs+NN97os65Pnz6eSZMmef71r395LBaL58yZMz7tV111lecPf/iDx+PxeJKTkz1ZWVk+7TfccIOnR48eP7jPmpoaT/PmzT1vv/22sU6S58033/SpmzJlik8/48aN89x+++3G8rp16zzh4eHGvM7MzPSMGjXKp49//etfnuDgYM8333zzg+MBfo4udm5mZGR47rrrLp/2cePGeW655RaffYwbN86nxvt5uXr16h8d4zXXXON58cUXjeXvfobW12V5Zqdfv34KCgoylq1Wq/bv36/du3erSZMmSk5ONtpat26tLl26aM+ePZKkxx57TE8//bRuuOEGTZkyRZ988slFjaVJkyb61a9+pWXLlkmSTp06pX/84x/GvyL//e9/6/Tp0xowYIBxb0GzZs30+uuv67PPPruofQM/peuuu85nuX379jp69Kg+/vhjnTx5Uq1bt/Z5jx84cMB4j+/bt099+/b12f77yxUVFRo5cqSuvvpqRUdHy2Kx6OTJk37/izA9PV3r16/X4cOHJX17ViktLc142ODjjz/WkiVLfMZqs9lUW1urAwcO+LUv4OfgYubmxerdu7fP8smTJ/X444+rW7duatGihZo1a6Y9e/Zc9JkdblD206OPPiqbzaa1a9equLhYM2fO1OzZszV27NgL7jM9PV233HKLjh49KrvdrsjISA0cOFCSjMtba9eu1RVXXOGz3c/h740A9RUaGuqzHBQUpNraWp08eVLt27fX+vXr62xzrqcZf0hGRoa++uorzZ8/X1deeaXCw8NltVpVXV3t1zj79Omjq666Sn/5y180ZswYvfnmm1qyZInRfvLkSf3mN7/RY489Vmfbjh07+rUv4OfgYuZmcHCwcc+rl/e2j/po2rSpz/Ljjz8uu92u3//+9+rcubMiIyN17733+j2Pv++yDDubN2/2WfZe309MTNTZs2e1efNm9e/fX5L01Vdfad++fUpMTDTq4+PjNXr0aI0ePVp5eXn64x//eM6wExYWppqamh8dT//+/RUfH68VK1bonXfe0X333We8+RITExUeHq5Dhw7plltuuZiXDfws9erVSw6HQ02aNDFuGv6+Ll26aOvWrXrooYeMdd+/5+aDDz7QokWLNHjwYEnSF198oS+//NKnJjQ0tF5zMj09XcuWLVOHDh0UHBystLQ0n/Hu3r1bnTt3ru9LBC5J9Zmbbdu21c6dO33WlZeX+wSo+n4WSt/O44cffti4Z/XkyZM6ePDgBY3/uy7Ly1iHDh1Sbm6u9u3bpz//+c968cUXNW7cOF199dW66667NHLkSL3//vv6+OOP9etf/1pXXHGF7rrrLknf3mW+bt06HThwQNu3b9c///lPdevW7Zz76dSpk06ePKmSkhJ9+eWXOn369A+O6YEHHlBBQYHsdrtxCUuSmjdvrscff1zjx4/X0qVL9dlnn2n79u168cUXtXTp0oY9MEAApKSkyGq1asiQISouLtbBgwe1adMm/d///Z+2bdsmSRo7dqxeffVVLV26VPv379fTTz+tTz75xOdy9NVXX60//elP2rNnjzZv3qz09HRFRkb67KtTp04qKSmRw+HQiRMnfnBM6enp2r59u5555hnde++9PmdRJ02apE2bNik7O1vl5eXav3+//vGPf3CDMkynPnPz9ttv17Zt2/T6669r//79mjJlSp3w06lTJ23evFkHDx7Ul19+qdra2h/c59VXX62///3vKi8v18cff6wHHnjgvPX1dVmGnYceekjffPON+vbtq6ysLI0bN874kr/FixcrKSlJv/zlL2W1WuXxeFRYWGik1JqaGmVlZalbt24aOHCgfvGLX2jRokXn3E///v01evRoDRs2TG3bttWsWbN+cEzp6enavXu3rrjiCt1www0+bTNmzNBTTz2lmTNnGvtdu3atEhISGuiIAIETFBSkwsJC3XzzzRoxYoR+8YtfaPjw4fr8888VExMj6dv5kZeXp8cff1y9evXSgQMH9PDDDysiIsLo59VXX9WJEyfUq1cvPfjgg3rsscfUrl07n33Nnj1bdrtd8fHxuv76639wTJ07d1bfvn31ySef+PzjQ/r2/oYNGzbo008/1U033aTrr79e+fn5iouLa8CjAgRefeamzWbTU089pYkTJ6pPnz76+uuvfc7ASt9emgoJCVFiYqLatm173vtv5syZo5YtW6p///668847ZbPZ1KtXr4t/LZ7vX2wzuVtvvVU9e/bkzzUAl7gBAwYoNjZWf/rTnwI9FAA/c5flPTsALi2nT59WQUGBbDabQkJC9Oc//1nvvvuu8V0gAHA+hB0AP3ve0+nPPPOMzpw5oy5duuhvf/ubUlJSAj00AJeAy+4yFgAAuLxcljcoAwCAywdhBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmBphBwAAmNr/B3PUwtgkWaqWAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reviews['Sentiment'] = reviews['Score'].map(lambda x: 'positive' if x >= 4 else 'neutral' if x == 3 else 'negative')\n",
    "\n",
    "reviews['Sentiment'].hist()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "b3bd1649",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(15003, 4)"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reviews = pd.concat(\n",
    "    [\n",
    "        reviews[reviews['Sentiment'] == 'positive'].sample(5000),\n",
    "        reviews[reviews['Sentiment'] == 'negative'].sample(5000),\n",
    "        reviews[reviews['Sentiment'] == 'neutral']\n",
    "    ]\n",
    ")\n",
    "\n",
    "reviews.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0c3c1095",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "afe1936d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<Axes: >"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjMAAAGdCAYAAADnrPLBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAArrElEQVR4nO3dfVTUdaLH8Q8gDKAO5hNoonJWU6jU1JSxB8kQVLZjRXt7oDTTunrwATmm67ll+NChvKvmFubezRXdm5u6u9X6UDBZaCY+YZhp67peXbpHgaumiOgwwtw/OvyOkw85OIRfer/O6Zzm9/vOd76/Ofzg7fxmIMDj8XgEAABgqMDGXgAAAMCNIGYAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGK1ZYy+godTW1urYsWNq2bKlAgICGns5AADgOng8Hp09e1YdO3ZUYOD1vebSZGPm2LFjio6ObuxlAACAevj222/VqVOn6xrbZGOmZcuWkr5/Mux2u9/mdbvdys/PV1JSkoKDg/02L4Drx3kINK6GPAcrKioUHR1t/Ry/Hk02ZuouLdntdr/HTHh4uOx2O99EgUbCeQg0rp/iHPTlLSK8ARgAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABG8ylmsrKyFBAQ4PVfz549rf0XLlxQenq62rRpoxYtWig1NVVlZWVec5SUlCglJUXh4eFq3769XnzxRV28eNFrTEFBgfr27SubzaZu3bopNze3/kcIAACaNJ9fmbn99tt1/Phx67+tW7da+6ZOnap169Zp7dq12rx5s44dO6ZHH33U2l9TU6OUlBRVV1dr27ZtWrFihXJzczVr1ixrzJEjR5SSkqIHHnhAxcXFysjI0Lhx45SXl3eDhwoAAJoin//QZLNmzRQVFXXZ9jNnzmjZsmVatWqVhgwZIklavny5YmNjtX37dsXHxys/P18HDhzQJ598osjISPXp00dz587VjBkzlJWVpZCQEC1dulQxMTFasGCBJCk2NlZbt27VokWLlJycfIOHCwAAmhqfY+bQoUPq2LGjQkND5XA4lJ2drc6dO6uoqEhut1uJiYnW2J49e6pz584qLCxUfHy8CgsLdeeddyoyMtIak5ycrAkTJmj//v266667VFhY6DVH3ZiMjIxrrsvlcsnlclm3KyoqJH3/lz3dbrevh3lVdXP5c04AvuE8BBpXQ56D9ZnTp5gZOHCgcnNz1aNHDx0/flyzZ8/Wfffdp6+//lqlpaUKCQlRq1atvO4TGRmp0tJSSVJpaalXyNTtr9t3rTEVFRU6f/68wsLCrri27OxszZ49+7Lt+fn5Cg8P9+Uwr4vT6fT7nAB8w3kINK6GOAerqqp8vo9PMTN8+HDr/3v16qWBAweqS5cuWrNmzVUj46cyc+ZMZWZmWrcrKioUHR2tpKQk2e12vz2O2+2W0+nUy7sD5aoN8Nu8De3rLC7RoengPERTc0eWWe8LtQV6NLd/rYYOHarg4GC/zl13ZcUXPl9mulSrVq1022236Z///KeGDh2q6upqnT592uvVmbKyMus9NlFRUdq5c6fXHHWfdrp0zA8/AVVWVia73X7NYLLZbLLZbJdtDw4O9vsTLUmu2gC5asz5JtoQzwHQ2DgP0VSY9HV8qYb4GVuf+W7o98xUVlbq8OHD6tChg/r166fg4GBt2rTJ2n/w4EGVlJTI4XBIkhwOh/bt26fy8nJrjNPplN1uV1xcnDXm0jnqxtTNAQAAcCmfYmbatGnavHmzjh49qm3btumRRx5RUFCQnnzySUVERGjs2LHKzMzUZ599pqKiIo0ZM0YOh0Px8fGSpKSkJMXFxemZZ57R3r17lZeXp5deeknp6enWqyrjx4/X//zP/2j69On6+9//riVLlmjNmjWaOnWq/48eAAAYz6fLTP/7v/+rJ598UidPnlS7du107733avv27WrXrp0kadGiRQoMDFRqaqpcLpeSk5O1ZMkS6/5BQUFav369JkyYIIfDoebNm2v06NGaM2eONSYmJkYbNmzQ1KlTtXjxYnXq1EnvvPMOH8sGAABX5FPMvPfee9fcHxoaqpycHOXk5Fx1TJcuXbRx48ZrzpOQkKAvv/zSl6UBAICfKf42EwAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGg3FDOvvfaaAgIClJGRYW27cOGC0tPT1aZNG7Vo0UKpqakqKyvzul9JSYlSUlIUHh6u9u3b68UXX9TFixe9xhQUFKhv376y2Wzq1q2bcnNzb2SpAACgiap3zOzatUu/+93v1KtXL6/tU6dO1bp167R27Vpt3rxZx44d06OPPmrtr6mpUUpKiqqrq7Vt2zatWLFCubm5mjVrljXmyJEjSklJ0QMPPKDi4mJlZGRo3LhxysvLq+9yAQBAE1WvmKmsrFRaWpp+//vf65ZbbrG2nzlzRsuWLdPChQs1ZMgQ9evXT8uXL9e2bdu0fft2SVJ+fr4OHDig//7v/1afPn00fPhwzZ07Vzk5OaqurpYkLV26VDExMVqwYIFiY2M1ceJEPfbYY1q0aJEfDhkAADQlzepzp/T0dKWkpCgxMVHz5s2zthcVFcntdisxMdHa1rNnT3Xu3FmFhYWKj49XYWGh7rzzTkVGRlpjkpOTNWHCBO3fv1933XWXCgsLveaoG3Pp5awfcrlccrlc1u2KigpJktvtltvtrs9hXlHdXLZAj9/m/Cn48zkAGhvnIZoaW5BZX8t1515DfE3XZ06fY+a9997Tnj17tGvXrsv2lZaWKiQkRK1atfLaHhkZqdLSUmvMpSFTt79u37XGVFRU6Pz58woLC7vssbOzszV79uzLtufn5ys8PPz6D/A6ze1f6/c5G9LGjRsbewmA33EeoqmYP6CxV1A/TqfT73NWVVX5fB+fYubbb7/VlClT5HQ6FRoa6vODNaSZM2cqMzPTul1RUaHo6GglJSXJbrf77XHcbrecTqde3h0oV22A3+ZtaF9nJTf2EgC/4TxEU3NHllnvCbUFejS3f62GDh2q4OBgv85dd2XFFz7FTFFRkcrLy9W3b19rW01NjbZs2aK33npLeXl5qq6u1unTp71enSkrK1NUVJQkKSoqSjt37vSat+7TTpeO+eEnoMrKymS326/4qowk2Ww22Wy2y7YHBwf7/YmWJFdtgFw15nwTbYjnAGhsnIdoKkz6Or5UQ/yMrc98Pr0B+MEHH9S+fftUXFxs/de/f3+lpaVZ/x8cHKxNmzZZ9zl48KBKSkrkcDgkSQ6HQ/v27VN5ebk1xul0ym63Ky4uzhpz6Rx1Y+rmAAAAqOPTKzMtW7bUHXfc4bWtefPmatOmjbV97NixyszMVOvWrWW32zVp0iQ5HA7Fx8dLkpKSkhQXF6dnnnlG8+fPV2lpqV566SWlp6dbr6yMHz9eb731lqZPn67nnntOn376qdasWaMNGzb445gBAEATUq9PM13LokWLFBgYqNTUVLlcLiUnJ2vJkiXW/qCgIK1fv14TJkyQw+FQ8+bNNXr0aM2ZM8caExMTow0bNmjq1KlavHixOnXqpHfeeUfJyVxvBgAA3m44ZgoKCrxuh4aGKicnRzk5OVe9T5cuXX70Xf0JCQn68ssvb3R5AACgieNvMwEAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADCaTzHz9ttvq1evXrLb7bLb7XI4HProo4+s/RcuXFB6erratGmjFi1aKDU1VWVlZV5zlJSUKCUlReHh4Wrfvr1efPFFXbx40WtMQUGB+vbtK5vNpm7duik3N7f+RwgAAJo0n2KmU6dOeu2111RUVKTdu3dryJAhGjlypPbv3y9Jmjp1qtatW6e1a9dq8+bNOnbsmB599FHr/jU1NUpJSVF1dbW2bdumFStWKDc3V7NmzbLGHDlyRCkpKXrggQdUXFysjIwMjRs3Tnl5eX46ZAAA0JQ082XwQw895HX71Vdf1dtvv63t27erU6dOWrZsmVatWqUhQ4ZIkpYvX67Y2Fht375d8fHxys/P14EDB/TJJ58oMjJSffr00dy5czVjxgxlZWUpJCRES5cuVUxMjBYsWCBJio2N1datW7Vo0SIlJyf76bABAEBT4VPMXKqmpkZr167VuXPn5HA4VFRUJLfbrcTERGtMz5491blzZxUWFio+Pl6FhYW68847FRkZaY1JTk7WhAkTtH//ft11110qLCz0mqNuTEZGxjXX43K55HK5rNsVFRWSJLfbLbfbXd/DvEzdXLZAj9/m/Cn48zkAGhvnIZoaW5BZX8t1515DfE3XZ06fY2bfvn1yOBy6cOGCWrRooffff19xcXEqLi5WSEiIWrVq5TU+MjJSpaWlkqTS0lKvkKnbX7fvWmMqKip0/vx5hYWFXXFd2dnZmj179mXb8/PzFR4e7uth/qi5/Wv9PmdD2rhxY2MvAfA7zkM0FfMHNPYK6sfpdPp9zqqqKp/v43PM9OjRQ8XFxTpz5oz+/Oc/a/To0dq8ebPPD+xvM2fOVGZmpnW7oqJC0dHRSkpKkt1u99vjuN1uOZ1Ovbw7UK7aAL/N29C+zuISHZoOzkM0NXdkmfW+UFugR3P712ro0KEKDg7269x1V1Z84XPMhISEqFu3bpKkfv36adeuXVq8eLEef/xxVVdX6/Tp016vzpSVlSkqKkqSFBUVpZ07d3rNV/dpp0vH/PATUGVlZbLb7Vd9VUaSbDabbDbbZduDg4P9/kRLkqs2QK4ac76JNsRzADQ2zkM0FSZ9HV+qIX7G1me+G/49M7W1tXK5XOrXr5+Cg4O1adMma9/BgwdVUlIih8MhSXI4HNq3b5/Ky8utMU6nU3a7XXFxcdaYS+eoG1M3BwAAwKV8emVm5syZGj58uDp37qyzZ89q1apVKigoUF5eniIiIjR27FhlZmaqdevWstvtmjRpkhwOh+Lj4yVJSUlJiouL0zPPPKP58+ertLRUL730ktLT061XVcaPH6+33npL06dP13PPPadPP/1Ua9as0YYNG/x/9AAAwHg+xUx5eblGjRql48ePKyIiQr169VJeXp6GDh0qSVq0aJECAwOVmpoql8ul5ORkLVmyxLp/UFCQ1q9frwkTJsjhcKh58+YaPXq05syZY42JiYnRhg0bNHXqVC1evFidOnXSO++8w8eyAQDAFfkUM8uWLbvm/tDQUOXk5CgnJ+eqY7p06fKj7+hPSEjQl19+6cvSAADAzxR/mwkAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRfIqZ7Oxs3X333WrZsqXat2+vhx9+WAcPHvQac+HCBaWnp6tNmzZq0aKFUlNTVVZW5jWmpKREKSkpCg8PV/v27fXiiy/q4sWLXmMKCgrUt29f2Ww2devWTbm5ufU7QgAA0KT5FDObN29Wenq6tm/fLqfTKbfbraSkJJ07d84aM3XqVK1bt05r167V5s2bdezYMT366KPW/pqaGqWkpKi6ulrbtm3TihUrlJubq1mzZlljjhw5opSUFD3wwAMqLi5WRkaGxo0bp7y8PD8cMgAAaEqa+TL4448/9rqdm5ur9u3bq6ioSPfff7/OnDmjZcuWadWqVRoyZIgkafny5YqNjdX27dsVHx+v/Px8HThwQJ988okiIyPVp08fzZ07VzNmzFBWVpZCQkK0dOlSxcTEaMGCBZKk2NhYbd26VYsWLVJycrKfDh0AADQFN/SemTNnzkiSWrduLUkqKiqS2+1WYmKiNaZnz57q3LmzCgsLJUmFhYW68847FRkZaY1JTk5WRUWF9u/fb425dI66MXVzAAAA1PHplZlL1dbWKiMjQ/fcc4/uuOMOSVJpaalCQkLUqlUrr7GRkZEqLS21xlwaMnX76/Zda0xFRYXOnz+vsLCwy9bjcrnkcrms2xUVFZIkt9stt9td38O8TN1ctkCP3+b8KfjzOQAaG+chmhpbkFlfy3XnXkN8TddnznrHTHp6ur7++mtt3bq1vlP4VXZ2tmbPnn3Z9vz8fIWHh/v98eb2r/X7nA1p48aNjb0EwO84D9FUzB/Q2CuoH6fT6fc5q6qqfL5PvWJm4sSJWr9+vbZs2aJOnTpZ26OiolRdXa3Tp097vTpTVlamqKgoa8zOnTu95qv7tNOlY374CaiysjLZ7fYrviojSTNnzlRmZqZ1u6KiQtHR0UpKSpLdbq/PYV6R2+2W0+nUy7sD5aoN8Nu8De3rLN5rhKaD8xBNzR1ZZn3AxRbo0dz+tRo6dKiCg4P9OnfdlRVf+BQzHo9HkyZN0vvvv6+CggLFxMR47e/Xr5+Cg4O1adMmpaamSpIOHjyokpISORwOSZLD4dCrr76q8vJytW/fXtL3ZWe32xUXF2eN+eG/YJxOpzXHldhsNtlstsu2BwcH+/2JliRXbYBcNeZ8E22I5wBobJyHaCpM+jq+VEP8jK3PfD7FTHp6ulatWqUPP/xQLVu2tN7jEhERobCwMEVERGjs2LHKzMxU69atZbfbNWnSJDkcDsXHx0uSkpKSFBcXp2eeeUbz589XaWmpXnrpJaWnp1sxMn78eL311luaPn26nnvuOX366adas2aNNmzY4PMBAgCAps2nTzO9/fbbOnPmjBISEtShQwfrv9WrV1tjFi1apF/+8pdKTU3V/fffr6ioKP31r3+19gcFBWn9+vUKCgqSw+HQ008/rVGjRmnOnDnWmJiYGG3YsEFOp1O9e/fWggUL9M477/CxbAAAcBmfLzP9mNDQUOXk5CgnJ+eqY7p06fKjb4RLSEjQl19+6cvyAADAzxB/mwkAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0YgYAABiNmAEAAEYjZgAAgNGIGQAAYDRiBgAAGI2YAQAARiNmAACA0YgZAABgNGIGAAAYjZgBAABGI2YAAIDRiBkAAGA0n2Nmy5Yteuihh9SxY0cFBATogw8+8Nrv8Xg0a9YsdejQQWFhYUpMTNShQ4e8xpw6dUppaWmy2+1q1aqVxo4dq8rKSq8xX331le677z6FhoYqOjpa8+fP9/3oAABAk+dzzJw7d069e/dWTk7OFffPnz9fv/3tb7V06VLt2LFDzZs3V3Jysi5cuGCNSUtL0/79++V0OrV+/Xpt2bJFL7zwgrW/oqJCSUlJ6tKli4qKivSf//mfysrK0n/913/V4xABAEBT1szXOwwfPlzDhw+/4j6Px6M33nhDL730kkaOHClJWrlypSIjI/XBBx/oiSee0DfffKOPP/5Yu3btUv/+/SVJb775pkaMGKHf/OY36tixo959911VV1frD3/4g0JCQnT77beruLhYCxcu9IoeAAAAn2PmWo4cOaLS0lIlJiZa2yIiIjRw4EAVFhbqiSeeUGFhoVq1amWFjCQlJiYqMDBQO3bs0COPPKLCwkLdf//9CgkJscYkJyfr9ddf13fffadbbrnlssd2uVxyuVzW7YqKCkmS2+2W2+322zHWzWUL9Phtzp+CP58DoLFxHqKpsQWZ9bVcd+41xNd0feb0a8yUlpZKkiIjI722R0ZGWvtKS0vVvn1770U0a6bWrVt7jYmJiblsjrp9V4qZ7OxszZ49+7Lt+fn5Cg8Pr+cRXd3c/rV+n7Mhbdy4sbGXAPgd5yGaivkDGnsF9eN0Ov0+Z1VVlc/38WvMNKaZM2cqMzPTul1RUaHo6GglJSXJbrf77XHcbrecTqde3h0oV22A3+ZtaF9nJTf2EgC/4TxEU3NHVl5jL8EntkCP5vav1dChQxUcHOzXueuurPjCrzETFRUlSSorK1OHDh2s7WVlZerTp481pry83Ot+Fy9e1KlTp6z7R0VFqayszGtM3e26MT9ks9lks9ku2x4cHOz3J1qSXLUBctWY8020IZ4DoLFxHqKpMOnr+FIN8TO2PvP59ffMxMTEKCoqSps2bbK2VVRUaMeOHXI4HJIkh8Oh06dPq6ioyBrz6aefqra2VgMHDrTGbNmyxeu6mdPpVI8ePa54iQkAAPx8+RwzlZWVKi4uVnFxsaTv3/RbXFyskpISBQQEKCMjQ/PmzdPf/vY37du3T6NGjVLHjh318MMPS5JiY2M1bNgwPf/889q5c6e++OILTZw4UU888YQ6duwoSXrqqacUEhKisWPHav/+/Vq9erUWL17sdRkJAABAqsdlpt27d+uBBx6wbtcFxujRo5Wbm6vp06fr3LlzeuGFF3T69Gnde++9+vjjjxUaGmrd591339XEiRP14IMPKjAwUKmpqfrtb39r7Y+IiFB+fr7S09PVr18/tW3bVrNmzeJj2QAA4DI+x0xCQoI8nqt/hCwgIEBz5szRnDlzrjqmdevWWrVq1TUfp1evXvr88899XR4AAPiZ4W8zAQAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjEbMAAAAoxEzAADAaMQMAAAwGjEDAACMRswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMNpNHTM5OTnq2rWrQkNDNXDgQO3cubOxlwQAAG4yN23MrF69WpmZmXrllVe0Z88e9e7dW8nJySovL2/spQEAgJvITRszCxcu1PPPP68xY8YoLi5OS5cuVXh4uP7whz809tIAAMBNpFljL+BKqqurVVRUpJkzZ1rbAgMDlZiYqMLCwivex+VyyeVyWbfPnDkjSTp16pTcbrff1uZ2u1VVVaVm7kDV1Ab4bd6GdvLkycZeAuA3nIdoappdPNfYS/BJs1qPqqpqdfLkSQUHB/t17rNnz0qSPB7P9a/HryvwkxMnTqimpkaRkZFe2yMjI/X3v//9ivfJzs7W7NmzL9seExPTIGs0TdsFjb0CAJyHaEqeauD5z549q4iIiOsae1PGTH3MnDlTmZmZ1u3a2lqdOnVKbdq0UUCA//7lVlFRoejoaH377bey2+1+mxfA9eM8BBpXQ56DHo9HZ8+eVceOHa/7PjdlzLRt21ZBQUEqKyvz2l5WVqaoqKgr3sdms8lms3lta9WqVUMtUXa7nW+iQCPjPAQaV0Odg9f7ikydm/INwCEhIerXr582bdpkbautrdWmTZvkcDgacWUAAOBmc1O+MiNJmZmZGj16tPr3768BAwbojTfe0Llz5zRmzJjGXhoAALiJ3LQx8/jjj+v//u//NGvWLJWWlqpPnz76+OOPL3tT8E/NZrPplVdeueySFoCfDuch0LhutnMwwOPLZ58AAABuMjfle2YAAACuFzEDAACMRswAAACjETPXqaCgQAEBATp9+vQ1x3Xt2lVvvPHGT7ImAD8uKytLffr0aexlALhO9fk5Ssxcp0GDBun48ePWL/LJzc294i/l27Vrl1544YWfeHUAJCkgIEAffPCB17Zp06Z5/c4qAP6VkJCgjIyMRl3DTfvR7JtNSEjIVX/78KXatWv3E6wGwPVq0aKFWrRo0djLAH7WPB6Pampq1KxZw2RHk3plJiEhQRMnTtTEiRMVERGhtm3b6uWXX7b+8uZ3332nUaNG6ZZbblF4eLiGDx+uQ4cOWff/17/+pYceeki33HKLmjdvrttvv10bN26U5H2ZqaCgQGPGjNGZM2cUEBCggIAAZWVlSfJ+eeypp57S448/7rVGt9uttm3bauXKlZK+/83G2dnZiomJUVhYmHr37q0///nPDfxMAf6VkJCgyZMna/r06WrdurWioqKsc0KSTp8+rXHjxqldu3ay2+0aMmSI9u7d6zXHvHnz1L59e7Vs2VLjxo3Tr3/9a6/LQ7t27dLQoUPVtm1bRUREaPDgwdqzZ4+1v2vXrpKkRx55RAEBAdbtSy8z5efnKzQ09LLLxVOmTNGQIUOs21u3btV9992nsLAwRUdHa/LkyTp3zqy/agxIN35uPvvss3r44Ye95szIyFBCQoK1f/PmzVq8eLH18/Do0aPWz8yPPvpI/fr1k81m09atW3X48GGNHDlSkZGRatGihe6++2598sknN3ycTSpmJGnFihVq1qyZdu7cqcWLF2vhwoV65513JH3/pO/evVt/+9vfVFhYKI/HoxEjRsjtdkuS0tPT5XK5tGXLFu3bt0+vv/76Ff9FN2jQIL3xxhuy2+06fvy4jh8/rmnTpl02Li0tTevWrVNlZaW1LS8vT1VVVXrkkUckff/XvleuXKmlS5dq//79mjp1qp5++mlt3ry5IZ4eoMGsWLFCzZs3144dOzR//nzNmTNHTqdTkvSrX/1K5eXl+uijj1RUVKS+ffvqwQcf1KlTpyRJ7777rl599VW9/vrrKioqUufOnfX22297zX/27FmNHj1aW7du1fbt29W9e3eNGDFCZ8+elfR97EjS8uXLdfz4cev2pR588EG1atVKf/nLX6xtNTU1Wr16tdLS0iRJhw8f1rBhw5SamqqvvvpKq1ev1tatWzVx4kT/P2nAT+BGzs0fs3jxYjkcDj3//PPWz8Po6Ghr/69//Wu99tpr+uabb9SrVy9VVlZqxIgR2rRpk7788ksNGzZMDz30kEpKSm7sID1NyODBgz2xsbGe2tpaa9uMGTM8sbGxnn/84x8eSZ4vvvjC2nfixAlPWFiYZ82aNR6Px+O58847PVlZWVec+7PPPvNI8nz33Xcej8fjWb58uSciIuKycV26dPEsWrTI4/F4PG6329O2bVvPypUrrf1PPvmk5/HHH/d4PB7PhQsXPOHh4Z5t27Z5zTF27FjPk08+6fPxA41l8ODBnnvvvddr29133+2ZMWOG5/PPP/fY7XbPhQsXvPb/4he/8Pzud7/zeDwez8CBAz3p6ele+++55x5P7969r/qYNTU1npYtW3rWrVtnbZPkef/9973GvfLKK17zTJkyxTNkyBDrdl5ensdms1nn9tixYz0vvPCC1xyff/65JzAw0HP+/Pmrrge4Gd3ouTl69GjPyJEjvfZPmTLFM3jwYK/HmDJliteYup+ZH3zwwY+u8fbbb/e8+eab1u1Lf45eryb3ykx8fLwCAgKs2w6HQ4cOHdKBAwfUrFkzDRw40NrXpk0b9ejRQ998840kafLkyZo3b57uuecevfLKK/rqq69uaC3NmjXTv/3bv+ndd9+VJJ07d04ffvih9S/Af/7zn6qqqtLQoUOt6/otWrTQypUrdfjw4Rt6bOCn1qtXL6/bHTp0UHl5ufbu3avKykq1adPG6+v8yJEj1tf5wYMHNWDAAK/7//B2WVmZnn/+eXXv3l0RERGy2+2qrKz0+V90aWlpKigo0LFjxyR9/6pQSkqK9Yb+vXv3Kjc312utycnJqq2t1ZEjR3x6LOBmcCPn5o3q37+/1+3KykpNmzZNsbGxatWqlVq0aKFvvvnmhl+Z4Q3Alxg3bpySk5O1YcMG5efnKzs7WwsWLNCkSZPqPWdaWpoGDx6s8vJyOZ1OhYWFadiwYZJkXX7asGGDbr31Vq/73Sx/7wK4XsHBwV63AwICVFtbq8rKSnXo0EEFBQWX3edKnwi8mtGjR+vkyZNavHixunTpIpvNJofDoerqap/Weffdd+sXv/iF3nvvPU2YMEHvv/++cnNzrf2VlZX693//d02ePPmy+3bu3NmnxwJuBjdybgYGBlrvO61T99aM69G8eXOv29OmTZPT6dRvfvMbdevWTWFhYXrsscd8Po9/qMnFzI4dO7xu111bj4uL08WLF7Vjxw4NGjRIknTy5EkdPHhQcXFx1vjo6GiNHz9e48eP18yZM/X73//+ijETEhKimpqaH13PoEGDFB0drdWrV+ujjz7Sr371K+sLKy4uTjabTSUlJRo8ePCNHDZw0+rbt69KS0vVrFkz6025P9SjRw/t2rVLo0aNsrb98D0vX3zxhZYsWaIRI0ZIkr799ludOHHCa0xwcPB1nZdpaWl699131alTJwUGBiolJcVrvQcOHFC3bt2u9xABI13PudmuXTt9/fXXXtuKi4u9Aul6fx5K35/Hzz77rPW+0crKSh09erRe679Uk7vMVFJSoszMTB08eFB/+tOf9Oabb2rKlCnq3r27Ro4cqeeff15bt27V3r179fTTT+vWW2/VyJEjJX3/Du28vDwdOXJEe/bs0WeffabY2NgrPk7Xrl1VWVmpTZs26cSJE6qqqrrqmp566iktXbpUTqfTusQkSS1bttS0adM0depUrVixQocPH9aePXv05ptvasWKFf59YoBGkpiYKIfDoYcfflj5+fk6evSotm3bpv/4j//Q7t27JUmTJk3SsmXLtGLFCh06dEjz5s3TV1995XXJuHv37vrjH/+ob775Rjt27FBaWprCwsK8Hqtr167atGmTSktL9d133111TWlpadqzZ49effVVPfbYY16vhM6YMUPbtm3TxIkTVVxcrEOHDunDDz/kDcBocq7n3BwyZIh2796tlStX6tChQ3rllVcui5uuXbtqx44dOnr0qE6cOKHa2tqrPmb37t3117/+VcXFxdq7d6+eeuqpa46/Xk0uZkaNGqXz589rwIABSk9P15QpU6xfYrd8+XL169dPv/zlL+VwOOTxeLRx40arMGtqapSenq7Y2FgNGzZMt912m5YsWXLFxxk0aJDGjx+vxx9/XO3atdP8+fOvuqa0tDQdOHBAt956q+655x6vfXPnztXLL7+s7Oxs63E3bNigmJgYPz0jQOMKCAjQxo0bdf/992vMmDG67bbb9MQTT+hf//qXIiMjJX1/jsycOVPTpk1T3759deTIET377LMKDQ215lm2bJm+++479e3bV88884wmT56s9u3bez3WggUL5HQ6FR0drbvuuuuqa+rWrZsGDBigr776yusfGNL37y/YvHmz/vGPf+i+++7TXXfdpVmzZqljx45+fFaAxnc952ZycrJefvllTZ8+XXfffbfOnj3r9Qqq9P2lo6CgIMXFxaldu3bXfP/LwoULdcstt2jQoEF66KGHlJycrL59+974sXh+eDHMYAkJCerTpw9/TgBoAoYOHaqoqCj98Y9/bOylALjJNbn3zAAwT1VVlZYuXark5GQFBQXpT3/6kz755BPrd2EAwLUQMwAaXd3L3a+++qouXLigHj166C9/+YsSExMbe2kADNCkLjMBAICfnyb3BmAAAPDzQswAAACjETMAAMBoxAwAADAaMQMAAIxGzAAAAKMRMwAAwGjEDAAAMBoxAwAAjPb/zfD022RWYXcAAAAASUVORK5CYII=",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "reviews['Sentiment'].hist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "1e489d4c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "efb0ea6a",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "4ecc72e1",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "MODEL = 'distilgpt2'\n",
    "\n",
    "tokenizer = GPT2Tokenizer.from_pretrained(MODEL)\n",
    "\n",
    "tokenizer.pad_token = tokenizer.eos_token\n",
    "\n",
    "#add two prompts, one for each task\n",
    "SENTIMENT_PROMPT = 'Sentiment Task'\n",
    "SUMMARIZE_PROMPT = 'Summarize Task'\n",
    "SENTIMENT_TOKEN = '\\nSentiment:'\n",
    "SUMMARIZE_TOKEN = '\\nSummarize:'\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "690adf98",
   "metadata": {},
   "outputs": [],
   "source": [
    "reviews['sentiment_text'] = f'{SENTIMENT_PROMPT}\\nReview: ' + reviews['Text'] + SENTIMENT_TOKEN +  ' ' + reviews['Sentiment'].astype(str)\n",
    "\n",
    "reviews['summarize_text'] = f'{SUMMARIZE_PROMPT}\\nReview: ' + reviews['Text'] + SUMMARIZE_TOKEN +  ' ' + reviews['Summary'].astype(str)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "d23b7afd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Sentiment Task\\nReview: Great price.  Product smells great and flavors foods really well.  Perks up bland tastes.  Kicks up your cooking a notch.\\nSentiment: positive',\n",
       " 'Sentiment Task\\nReview: The Sugar Free Peach rings were delicious.  They are almost as good as the real peach rings, just not as tart.  I just ordered a second bag!!\\nSentiment: positive']"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reviews['sentiment_text'].head(2).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "cdee58b9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sentiment Task\n",
      "Review: I just made this for lunch. It had almost no flavor, although it smelled heavenly for the first few minutes of cooking.\n",
      "Sentiment: negative\n"
     ]
    }
   ],
   "source": [
    "print('Sentiment Task\\nReview: I just made this for lunch. It had almost no flavor, although it smelled heavenly for the first few minutes of cooking.\\nSentiment: negative')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "d804737d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['Summarize Task\\nReview: Great price.  Product smells great and flavors foods really well.  Perks up bland tastes.  Kicks up your cooking a notch.\\nSummarize: Smells sweet and smoky!',\n",
       " 'Summarize Task\\nReview: The Sugar Free Peach rings were delicious.  They are almost as good as the real peach rings, just not as tart.  I just ordered a second bag!!\\nSummarize: Almost as good as the real thing']"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "reviews['summarize_text'].head(2).tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "0b7fe460",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summarize Task\n",
      "Review: I just made this for lunch. It had almost no flavor, although it smelled heavenly for the first few minutes of cooking.\n",
      "Summarize: Not bad, but bland\n"
     ]
    }
   ],
   "source": [
    "print('Summarize Task\\nReview: I just made this for lunch. It had almost no flavor, although it smelled heavenly for the first few minutes of cooking.\\nSummarize: Not bad, but bland')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "aa096cc5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "657237e0",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "30006\n"
     ]
    }
   ],
   "source": [
    "reviews = reviews.sample(frac=1)\n",
    "\n",
    "training_examples = reviews['summarize_text'].tolist() + reviews['sentiment_text'].tolist()\n",
    "\n",
    "print(len(training_examples))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "34df23c0",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Parameter 'function'=<function preprocess at 0x7fae18510310> of the transform datasets.arrow_dataset.Dataset._map_single couldn't be hashed properly, a random hash was used instead. Make sure your transforms and parameters are serializable with pickle or dill for the dataset fingerprinting and caching to work. If you reuse this transform, the caching mechanism will consider it to be different from the previous calls and recompute everything. This warning is only showed once. Subsequent hashing failures won't be showed.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1133242f8f6149039a2cbb49d89cd7c7",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/31 [00:00<?, ?ba/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "multi_task_df = pd.DataFrame({'text': training_examples})\n",
    "\n",
    "data = Dataset.from_pandas(multi_task_df)\n",
    "\n",
    "def preprocess(examples):\n",
    "    return tokenizer(examples['text'], truncation=True)\n",
    "\n",
    "data = data.map(preprocess, batched=True)\n",
    "\n",
    "data = data.train_test_split(train_size=.9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "8dac23a1",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 203,
   "id": "11f10eaa",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<|endoftext|>Summarize Task\n",
      "Review: Decent corn. Del monte is better, and I prefer white corn, but this was ok. Quite wattery, so make sure you drain!\n",
      "Summarize: Decent<|endoftext|>\n"
     ]
    }
   ],
   "source": [
    "# NOTE it is common to manually add BOS (beginning of sentence) and EOS (end of sentence) tokens manually\n",
    "#  to stop the model from predicting past where you want it to. I am explicitly not doing that to show you what\n",
    "#  what GPT would do without those tokens. If you plan to use something like this in production, I would\n",
    "#  recommend adding in those tokens manually like so:\n",
    "\n",
    "print(multi_task_df['text'].map(lambda x: f'{tokenizer.bos_token}{x}{tokenizer.eos_token}')[0])\n",
    "\n",
    "# you may also want to make a different start, pad and eos token so that they aren't all the default <endoftext> token\n",
    "#  if you do, you may need to resize your model's tokenizer embedding"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "024f7e4d",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "1c356604",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "model = GPT2LMHeadModel.from_pretrained(MODEL)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "365f7b31",
   "metadata": {},
   "outputs": [],
   "source": [
    "data_collator = DataCollatorForLanguageModeling(tokenizer=tokenizer, mlm=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6fb033e7",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "9b8b5abb",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The following columns in the evaluation set don't have a corresponding argument in `GPT2LMHeadModel.forward` and have been ignored: text. If text are not expected by `GPT2LMHeadModel.forward`,  you can safely ignore this message.\n",
      "***** Running Evaluation *****\n",
      "  Num examples = 3001\n",
      "  Batch size = 32\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='188' max='94' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [94/94 6:00:26]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "{'eval_loss': 5.0312018394470215,\n",
       " 'eval_runtime': 740.1346,\n",
       " 'eval_samples_per_second': 4.055,\n",
       " 'eval_steps_per_second': 0.127}"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "training_args = TrainingArguments(\n",
    "    output_dir=\"./gpt2_multitask\", #The output directory\n",
    "    overwrite_output_dir=True, #overwrite the content of the output directory\n",
    "    num_train_epochs=3, # number of training epochs\n",
    "    per_device_train_batch_size=32, # batch size for training\n",
    "    per_device_eval_batch_size=32,  # batch size for evaluation\n",
    "    logging_steps=50,\n",
    "    learning_rate=.001,\n",
    "    load_best_model_at_end=True,\n",
    "    evaluation_strategy='epoch',\n",
    "    save_strategy='epoch'\n",
    ")\n",
    "\n",
    "trainer = Trainer(\n",
    "    model=model,\n",
    "    args=training_args,\n",
    "    train_dataset=data['train'],\n",
    "    eval_dataset=data['test'],\n",
    "    data_collator=data_collator\n",
    ")\n",
    "\n",
    "trainer.evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "0e34721f",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The following columns in the training set don't have a corresponding argument in `GPT2LMHeadModel.forward` and have been ignored: text. If text are not expected by `GPT2LMHeadModel.forward`,  you can safely ignore this message.\n",
      "/Users/sinanozdemir/opt/anaconda3/lib/python3.9/site-packages/transformers/optimization.py:306: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n",
      "  warnings.warn(\n",
      "***** Running training *****\n",
      "  Num examples = 27005\n",
      "  Num Epochs = 3\n",
      "  Instantaneous batch size per device = 32\n",
      "  Total train batch size (w. parallel, distributed & accumulation) = 32\n",
      "  Gradient Accumulation steps = 1\n",
      "  Total optimization steps = 2532\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='2532' max='2532' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [2532/2532 17:24:18, Epoch 3/3]\n",
       "    </div>\n",
       "    <table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       " <tr style=\"text-align: left;\">\n",
       "      <th>Epoch</th>\n",
       "      <th>Training Loss</th>\n",
       "      <th>Validation Loss</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <td>1</td>\n",
       "      <td>2.235800</td>\n",
       "      <td>2.069937</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>2</td>\n",
       "      <td>1.541500</td>\n",
       "      <td>1.612124</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <td>3</td>\n",
       "      <td>1.030800</td>\n",
       "      <td>1.393526</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table><p>"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The following columns in the evaluation set don't have a corresponding argument in `GPT2LMHeadModel.forward` and have been ignored: text. If text are not expected by `GPT2LMHeadModel.forward`,  you can safely ignore this message.\n",
      "***** Running Evaluation *****\n",
      "  Num examples = 3001\n",
      "  Batch size = 32\n",
      "Saving model checkpoint to ./gpt2_multitask/checkpoint-844\n",
      "Configuration saved in ./gpt2_multitask/checkpoint-844/config.json\n",
      "Model weights saved in ./gpt2_multitask/checkpoint-844/pytorch_model.bin\n",
      "The following columns in the evaluation set don't have a corresponding argument in `GPT2LMHeadModel.forward` and have been ignored: text. If text are not expected by `GPT2LMHeadModel.forward`,  you can safely ignore this message.\n",
      "***** Running Evaluation *****\n",
      "  Num examples = 3001\n",
      "  Batch size = 32\n",
      "Saving model checkpoint to ./gpt2_multitask/checkpoint-1688\n",
      "Configuration saved in ./gpt2_multitask/checkpoint-1688/config.json\n",
      "Model weights saved in ./gpt2_multitask/checkpoint-1688/pytorch_model.bin\n",
      "The following columns in the evaluation set don't have a corresponding argument in `GPT2LMHeadModel.forward` and have been ignored: text. If text are not expected by `GPT2LMHeadModel.forward`,  you can safely ignore this message.\n",
      "***** Running Evaluation *****\n",
      "  Num examples = 3001\n",
      "  Batch size = 32\n",
      "Saving model checkpoint to ./gpt2_multitask/checkpoint-2532\n",
      "Configuration saved in ./gpt2_multitask/checkpoint-2532/config.json\n",
      "Model weights saved in ./gpt2_multitask/checkpoint-2532/pytorch_model.bin\n",
      "\n",
      "\n",
      "Training completed. Do not forget to share your model on huggingface.co/models =)\n",
      "\n",
      "\n",
      "Loading best model from ./gpt2_multitask/checkpoint-2532 (score: 1.3935256004333496).\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "TrainOutput(global_step=2532, training_loss=1.7913735361084178, metrics={'train_runtime': 62682.6122, 'train_samples_per_second': 1.292, 'train_steps_per_second': 0.04, 'total_flos': 1186835358449664.0, 'train_loss': 1.7913735361084178, 'epoch': 3.0})"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer.train()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "7ad5ebfd",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The following columns in the evaluation set don't have a corresponding argument in `GPT2LMHeadModel.forward` and have been ignored: text. If text are not expected by `GPT2LMHeadModel.forward`,  you can safely ignore this message.\n",
      "***** Running Evaluation *****\n",
      "  Num examples = 3001\n",
      "  Batch size = 32\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "\n",
       "    <div>\n",
       "      \n",
       "      <progress value='94' max='94' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
       "      [94/94 12:29]\n",
       "    </div>\n",
       "    "
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/plain": [
       "{'eval_loss': 1.3935256004333496,\n",
       " 'eval_runtime': 759.1195,\n",
       " 'eval_samples_per_second': 3.953,\n",
       " 'eval_steps_per_second': 0.124,\n",
       " 'epoch': 3.0}"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "trainer.evaluate()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "0457ee8c",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Saving model checkpoint to ./gpt2_multitask\n",
      "Configuration saved in ./gpt2_multitask/config.json\n",
      "Model weights saved in ./gpt2_multitask/pytorch_model.bin\n"
     ]
    }
   ],
   "source": [
    "trainer.save_model()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "b656986c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "loading configuration file ./gpt2_multitask/config.json\n",
      "Model config GPT2Config {\n",
      "  \"_name_or_path\": \"distilgpt2\",\n",
      "  \"_num_labels\": 1,\n",
      "  \"activation_function\": \"gelu_new\",\n",
      "  \"architectures\": [\n",
      "    \"GPT2LMHeadModel\"\n",
      "  ],\n",
      "  \"attn_pdrop\": 0.1,\n",
      "  \"bos_token_id\": 50256,\n",
      "  \"embd_pdrop\": 0.1,\n",
      "  \"eos_token_id\": 50256,\n",
      "  \"id2label\": {\n",
      "    \"0\": \"LABEL_0\"\n",
      "  },\n",
      "  \"initializer_range\": 0.02,\n",
      "  \"label2id\": {\n",
      "    \"LABEL_0\": 0\n",
      "  },\n",
      "  \"layer_norm_epsilon\": 1e-05,\n",
      "  \"model_type\": \"gpt2\",\n",
      "  \"n_ctx\": 1024,\n",
      "  \"n_embd\": 768,\n",
      "  \"n_head\": 12,\n",
      "  \"n_inner\": null,\n",
      "  \"n_layer\": 6,\n",
      "  \"n_positions\": 1024,\n",
      "  \"reorder_and_upcast_attn\": false,\n",
      "  \"resid_pdrop\": 0.1,\n",
      "  \"scale_attn_by_inverse_layer_idx\": false,\n",
      "  \"scale_attn_weights\": true,\n",
      "  \"summary_activation\": null,\n",
      "  \"summary_first_dropout\": 0.1,\n",
      "  \"summary_proj_to_labels\": true,\n",
      "  \"summary_type\": \"cls_index\",\n",
      "  \"summary_use_proj\": true,\n",
      "  \"task_specific_params\": {\n",
      "    \"text-generation\": {\n",
      "      \"do_sample\": true,\n",
      "      \"max_length\": 50\n",
      "    }\n",
      "  },\n",
      "  \"torch_dtype\": \"float32\",\n",
      "  \"transformers_version\": \"4.19.4\",\n",
      "  \"use_cache\": true,\n",
      "  \"vocab_size\": 50257\n",
      "}\n",
      "\n",
      "loading weights file ./gpt2_multitask/pytorch_model.bin\n",
      "All model checkpoint weights were used when initializing GPT2LMHeadModel.\n",
      "\n",
      "All the weights of GPT2LMHeadModel were initialized from the model checkpoint at ./gpt2_multitask.\n",
      "If your task is similar to the task the model of the checkpoint was trained on, you can already use GPT2LMHeadModel for predictions without further training.\n"
     ]
    }
   ],
   "source": [
    "loaded_model = GPT2LMHeadModel.from_pretrained('./gpt2_multitask')\n",
    "\n",
    "generator = pipeline('text-generation', model=loaded_model, tokenizer=tokenizer)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "33fefe8b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "58e48142",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "positive\n",
      "SPICY!\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "29"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "text_sample, score, summary = reviews.sample(1)[['Text', 'Sentiment', 'Summary']].values[0]\n",
    "\n",
    "print(text_sample)\n",
    "print(score)\n",
    "print(summary)\n",
    "\n",
    "num_tokens = len(tokenizer(text_sample)['input_ids'])\n",
    "num_tokens"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "9ecb17d4",
   "metadata": {},
   "outputs": [],
   "source": [
    "sentiment_text_sample = f'{SENTIMENT_PROMPT}\\nReview: {text_sample}{SENTIMENT_TOKEN}'\n",
    "summarize_text_sample = f'{SUMMARIZE_PROMPT}\\nReview: {text_sample}{SUMMARIZE_TOKEN}'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "a02c3e61",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment:\n"
     ]
    }
   ],
   "source": [
    "print(sentiment_text_sample)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "fb5354f6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summarize Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Summarize:\n"
     ]
    }
   ],
   "source": [
    "print(summarize_text_sample)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b913bc4c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "687eb473",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n",
      "Input length of input_ids is 39, but ``max_length`` is set to 30. This can lead to unexpected behavior. You should consider increasing ``config.max_length`` or ``max_length``.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: positive\n",
      "----\n",
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: positive\n",
      "----\n",
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: positive\n",
      "----\n"
     ]
    }
   ],
   "source": [
    "for generated_text in generator(\n",
    "    sentiment_text_sample, \n",
    "    num_return_sequences=3, \n",
    "    max_length=num_tokens + 1, \n",
    "    temperature=0.2\n",
    "):\n",
    "    print(generated_text['generated_text'])\n",
    "    print('----')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "73126886",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summarize Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Summarize: Great noodles! Fast delivery! Spicy\n",
      "----\n",
      "Summarize Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Summarize: Very spicy! Too much seasoning! Too\n",
      "----\n",
      "Summarize Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Summarize: Very Spicy! Spicy! Our\n",
      "----\n"
     ]
    }
   ],
   "source": [
    "for generated_text in generator(\n",
    "    summarize_text_sample, \n",
    "    num_return_sequences=3, \n",
    "    max_length=num_tokens + 20, \n",
    "    temperature=0.7,\n",
    "    beams=3, \n",
    "):\n",
    "    print(generated_text['generated_text'])\n",
    "    print('----')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "cbeb072b",
   "metadata": {},
   "outputs": [],
   "source": [
    "def process(text):\n",
    "    sentiment_text_sample = f'{SENTIMENT_PROMPT}\\nReview: {text}{SENTIMENT_TOKEN}'\n",
    "    summarize_text_sample = f'{SUMMARIZE_PROMPT}\\nReview: {text}{SUMMARIZE_TOKEN}'\n",
    "    \n",
    "    print('----Summaries----')\n",
    "    num_tokens = len(tokenizer(summarize_text_sample)['input_ids'])\n",
    "    for generated_text in generator(\n",
    "        summarize_text_sample, \n",
    "        num_return_sequences=3,\n",
    "        beams=5, \n",
    "        max_length=num_tokens + 10, \n",
    "        temperature=0.7\n",
    "    ):\n",
    "        print(generated_text['generated_text'].split(SUMMARIZE_TOKEN)[1])\n",
    "    print('----Sentiment----')\n",
    "    num_tokens = len(tokenizer(sentiment_text_sample)['input_ids'])\n",
    "    for generated_text in generator(\n",
    "        sentiment_text_sample, \n",
    "        num_return_sequences=1, \n",
    "        max_length=num_tokens + 1, \n",
    "        temperature=0.2\n",
    "    ):\n",
    "        print(generated_text['generated_text'].split(SENTIMENT_TOKEN)[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "id": "70d53fd7",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----Summaries----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Yum! Yum! Yum! Y\n",
      " Yummy and healthy! My dog loved it!\n",
      " Yummy and healthy! Best food I have ever\n",
      "----Sentiment----\n",
      " positive\n"
     ]
    }
   ],
   "source": [
    "process('I am a big fan of this dog food. Very yummy and my dog loved it too!')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 165,
   "id": "ef078449",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "----Summaries----\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " Great stuff!  Very good rice!  Best\n",
      " Best rice product on the market! Goes great with\n",
      " Great taste, easy to prepare and easy to prepare\n",
      "----Sentiment----\n",
      " positive\n"
     ]
    }
   ],
   "source": [
    "# a review I saw on ubereats while I was ordering dinner last night\n",
    "process('All kinds of nice flavors and textures to enjoy in their rice bowls, loved it!')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e4ab9801",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "eaa9e656",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Trying with a non-finetuned GPT2 to see the style difference"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "a0452f41",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "loading configuration file https://huggingface.co/gpt2/resolve/main/config.json from cache at /Users/sinanozdemir/.cache/huggingface/transformers/fc674cd6907b4c9e933cb42d67662436b89fa9540a1f40d7c919d0109289ad01.7d2e0efa5ca20cef4fb199382111e9d3ad96fd77b849e1d4bed13a66e1336f51\n",
      "Model config GPT2Config {\n",
      "  \"activation_function\": \"gelu_new\",\n",
      "  \"architectures\": [\n",
      "    \"GPT2LMHeadModel\"\n",
      "  ],\n",
      "  \"attn_pdrop\": 0.1,\n",
      "  \"bos_token_id\": 50256,\n",
      "  \"embd_pdrop\": 0.1,\n",
      "  \"eos_token_id\": 50256,\n",
      "  \"initializer_range\": 0.02,\n",
      "  \"layer_norm_epsilon\": 1e-05,\n",
      "  \"model_type\": \"gpt2\",\n",
      "  \"n_ctx\": 1024,\n",
      "  \"n_embd\": 768,\n",
      "  \"n_head\": 12,\n",
      "  \"n_inner\": null,\n",
      "  \"n_layer\": 12,\n",
      "  \"n_positions\": 1024,\n",
      "  \"reorder_and_upcast_attn\": false,\n",
      "  \"resid_pdrop\": 0.1,\n",
      "  \"scale_attn_by_inverse_layer_idx\": false,\n",
      "  \"scale_attn_weights\": true,\n",
      "  \"summary_activation\": null,\n",
      "  \"summary_first_dropout\": 0.1,\n",
      "  \"summary_proj_to_labels\": true,\n",
      "  \"summary_type\": \"cls_index\",\n",
      "  \"summary_use_proj\": true,\n",
      "  \"task_specific_params\": {\n",
      "    \"text-generation\": {\n",
      "      \"do_sample\": true,\n",
      "      \"max_length\": 50\n",
      "    }\n",
      "  },\n",
      "  \"transformers_version\": \"4.19.4\",\n",
      "  \"use_cache\": true,\n",
      "  \"vocab_size\": 50257\n",
      "}\n",
      "\n",
      "loading weights file https://huggingface.co/gpt2/resolve/main/pytorch_model.bin from cache at /Users/sinanozdemir/.cache/huggingface/transformers/752929ace039baa8ef70fe21cdf9ab9445773d20e733cf693d667982e210837e.323c769945a351daa25546176f8208b3004b6f563438a7603e7932bae9025925\n",
      "All model checkpoint weights were used when initializing GPT2LMHeadModel.\n",
      "\n",
      "All the weights of GPT2LMHeadModel were initialized from the model checkpoint at gpt2.\n",
      "If your task is similar to the task the model of the checkpoint was trained on, you can already use GPT2LMHeadModel for predictions without further training.\n"
     ]
    }
   ],
   "source": [
    "non_fintuned_generator = pipeline(\n",
    "    'text-generation', model=GPT2LMHeadModel.from_pretrained('gpt2'), tokenizer=tokenizer\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "255df2d6",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n",
      "Input length of input_ids is 39, but ``max_length`` is set to 30. This can lead to unexpected behavior. You should consider increasing ``config.max_length`` or ``max_length``.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: Great\n",
      "-------\n",
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: These\n",
      "-------\n",
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: Love\n",
      "-------\n",
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: The\n",
      "-------\n",
      "Sentiment Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Sentiment: This\n",
      "-------\n"
     ]
    }
   ],
   "source": [
    "for generated_text in non_fintuned_generator(sentiment_text_sample, num_return_sequences=5, max_length=num_tokens + 1):\n",
    "    print(generated_text['generated_text'])\n",
    "    print('-------')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "009716c4",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summarize Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Summarize: We use three whole ingredients here, they\n",
      "----\n",
      "Summarize Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Summarize: We used these with everything from our \"\n",
      "----\n",
      "Summarize Task\n",
      "Review: Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "Summarize: These will be great if you are wanting\n",
      "----\n"
     ]
    }
   ],
   "source": [
    "for generated_text in non_fintuned_generator(summarize_text_sample, num_return_sequences=3, max_length=num_tokens + 20):\n",
    "    print(generated_text['generated_text'])\n",
    "    print('----')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "7e3316a1",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:50256 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Summarization Task\n",
      "Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "TL;DR:\n",
      "For the \"tummy-sushi\",\n",
      "----\n",
      "Summarization Task\n",
      "Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "TL;DR: I will NEVER buy this, they do not work\n",
      "----\n",
      "Summarization Task\n",
      "Our family loves these udon type noodles, thick and chewy. Very spicey so we only use half a pack of seasoning for each.\n",
      "TL;DR: The following Udon noodles are ready to cook.\n",
      "----\n"
     ]
    }
   ],
   "source": [
    "for generated_text in non_fintuned_generator(f'Summarization Task\\n{text_sample}\\nTL;DR:', num_return_sequences=3, max_length=num_tokens + 20):\n",
    "    print(generated_text['generated_text'])\n",
    "    print('----')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "0f84b44e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "5be8f799",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
